From 47a79e3ebda2a42db25777f464b69586f9bbe47e Mon Sep 17 00:00:00 2001 From: Darren Cohen <39422044+dargilco@users.noreply.github.com> Date: Thu, 30 Oct 2025 08:42:27 -0700 Subject: [PATCH 01/76] Copy code from https://github.com/Azure/azure-sdk-for-python-pr/tree/feature/azure-ai-projects/2.0.0b1/sdk/ai/azure-ai-projects --- sdk/ai/azure-ai-projects/.env.template | 21 +- .../AGENTS_MIGRATION_GUIDE.md | 519 - sdk/ai/azure-ai-projects/CHANGELOG.md | 5 +- sdk/ai/azure-ai-projects/README.md | 157 +- sdk/ai/azure-ai-projects/_metadata.json | 2 +- .../azure-ai-projects/apiview-properties.json | 498 +- sdk/ai/azure-ai-projects/assets.json | 2 +- .../azure/ai/projects/_client.py | 56 +- .../azure/ai/projects/_configuration.py | 18 +- .../azure/ai/projects/_patch.py | 230 +- .../azure/ai/projects/_types.py | 13 + .../azure/ai/projects/_utils/model_base.py | 2 +- .../azure/ai/projects/_validation.py | 4 +- .../azure/ai/projects/_version.py | 2 +- .../azure/ai/projects/aio/_client.py | 56 +- .../azure/ai/projects/aio/_configuration.py | 18 +- .../azure/ai/projects/aio/_patch.py | 231 +- .../ai/projects/aio/operations/__init__.py | 16 +- .../ai/projects/aio/operations/_operations.py | 7155 +++++++- .../azure/ai/projects/models/__init__.py | 756 +- .../azure/ai/projects/models/_enums.py | 619 +- .../azure/ai/projects/models/_models.py | 15189 ++++++++++++++-- .../azure/ai/projects/operations/__init__.py | 16 +- .../ai/projects/operations/_operations.py | 8693 ++++++++- .../azure/ai/projects/telemetry/__init__.py | 13 + .../telemetry/_ai_project_instrumentor.py | 1068 ++ .../ai/projects/telemetry/_trace_function.py | 204 + .../azure/ai/projects/telemetry/_utils.py | 168 + sdk/ai/azure-ai-projects/cspell.json | 10 + sdk/ai/azure-ai-projects/dev_requirements.txt | 4 + .../azure-ai-projects/post-emitter-fixes.cmd | 20 +- sdk/ai/azure-ai-projects/pyproject.toml | 6 +- sdk/ai/azure-ai-projects/pyrightconfig.json | 3 +- .../samples/agents/README.md | 8 - .../agents/assets/cua_browser_search.png | Bin 0 -> 566095 bytes .../agents/assets/cua_search_results.png | Bin 0 -> 52410 bytes .../agents/assets/cua_search_typed.png | Bin 0 -> 801677 bytes .../samples/agents/assets/product_info.md | 51 + .../synthetic_500_quarterly_results.csv | 14 + .../samples/agents/sample_agent_basic.py | 86 + .../agents/sample_agent_basic_async.py | 93 + .../samples/agents/sample_agent_crud.py | 87 + .../samples/agents/sample_agent_crud_async.py | 98 + ...ample_agent_file_search_in_stream_async.py | 196 + ...sample_agent_responses_code_interpreter.py | 47 + ...ple_agent_responses_function_tool_async.py | 128 + .../agents/sample_agent_retrieve_basic.py | 64 + .../samples/agents/sample_agents.py | 54 - .../samples/agents/sample_agents_async.py | 59 - .../sample_container_app_agent_basic.py | 85 + .../sample_container_app_agent_basic_async.py | 94 + .../agents/sample_conversation_crud.py | 71 + .../agents/sample_conversation_crud_async.py | 76 + .../samples/agents/sample_responses_basic.py | 56 + .../agents/sample_responses_basic_async.py | 65 + .../agents/sample_responses_stream_manager.py | 80 + .../agents/sample_responses_streaming.py | 91 + ..._agent_basic_with_azure_monitor_tracing.py | 70 + ...sample_agent_basic_with_console_tracing.py | 80 + ..._with_console_tracing_custom_attributes.py | 102 + .../samples/agents/tools/computer_use_util.py | 162 + .../agents/tools/sample_agent_file_search.py | 82 + .../sample_agent_file_search_in_stream.py | 181 + .../sample_agent_responses_function_tool.py | 116 + .../agents/tools/sample_agent_web_search.py | 70 + .../tools/sample_responses_computer_use.py | 161 + .../sample_responses_computer_use_async.py | 170 + .../sample_responses_image_generation.py | 90 + ...sample_responses_image_generation_async.py | 101 + .../agents/tools/sample_responses_mcp.py | 112 + .../tools/sample_responses_mcp_async.py | 123 + .../sample_agent_code_interpreter.py | 114 + .../sample_responses_structured_output.py | 25 + .../sample_responses_text_generation.py | 7 + .../samples_responses_conversation.py | 21 + .../samples_responses_image_input.py | 24 + .../samples_responses_websearch.py | 9 + .../samples/connections/sample_connections.py | 2 +- .../connections/sample_connections_async.py | 2 +- .../samples/datasets/sample_datasets.py | 2 +- .../samples/datasets/sample_datasets_async.py | 2 +- .../datasets/sample_datasets_download.py | 2 +- .../samples/deployments/sample_deployments.py | 2 +- .../deployments/sample_deployments_async.py | 2 +- .../data_folder/sample_data_evaluation.jsonl | 1 - .../evaluation/sample_agent_evaluations.py | 96 - .../samples/evaluation/sample_evaluations.py | 122 - .../sample_evaluations_aoai_graders.py | 164 - .../evaluation/sample_evaluations_async.py | 126 - .../samples/files/data/test_file.jsonl | 10 + .../samples/files/sample_files.py | 64 + .../samples/files/sample_files_async.py | 72 + .../samples/indexes/sample_indexes.py | 2 +- .../samples/indexes/sample_indexes_async.py | 2 +- ...pletions_with_azure_ai_inference_client.py | 2 +- ...erence_client_and_azure_monitor_tracing.py | 2 +- ...ns_with_azure_ai_inference_client_async.py | 2 +- ...beddings_with_azure_ai_inference_client.py | 2 +- ...gs_with_azure_ai_inference_client_async.py | 2 +- ...beddings_with_azure_ai_inference_client.py | 2 +- ...gs_with_azure_ai_inference_client_async.py | 2 +- ...at_completions_with_azure_openai_client.py | 8 +- ...openai_client_and_azure_monitor_tracing.py | 5 +- ...azure_openai_client_and_console_tracing.py | 5 +- ...pletions_with_azure_openai_client_async.py | 6 +- ...mple_responses_with_azure_openai_client.py | 6 +- ...esponses_with_azure_openai_client_async.py | 6 +- .../samples/red_team/sample_red_team.py | 2 +- .../samples/red_team/sample_red_team_async.py | 2 +- .../samples/telemetry/sample_telemetry.py | 2 +- .../telemetry/sample_telemetry_async.py | 2 +- .../agents/telemetry/gen_ai_trace_verifier.py | 192 + .../agents/telemetry/memory_trace_exporter.py | 49 + .../telemetry/test_ai_agents_instrumentor.py | 337 + .../test_ai_agents_instrumentor_async.py | 215 + .../telemetry/test_ai_instrumentor_base.py | 502 + .../tests/agents/test_agent_responses_crud.py | 152 + .../agents/test_agent_responses_crud_async.py | 124 + .../tests/agents/test_agents_crud.py | 122 + .../tests/agents/test_agents_crud_async.py | 116 + .../tests/agents/test_container_app_agents.py | 63 + .../agents/test_container_app_agents_async.py | 65 + .../tests/agents/test_conversation_crud.py | 105 + .../agents/test_conversation_crud_async.py | 88 + .../agents/test_conversation_items_crud.py | 152 + .../test_conversation_items_crud_async.py | 130 + .../tests/agents/test_hosted_agents.py | 44 + .../tests/agents/test_responses.py | 123 + .../tests/agents/test_responses_async.py | 39 + sdk/ai/azure-ai-projects/tests/conftest.py | 6 +- .../{ => connections}/test_connections.py | 9 +- .../test_connections_async.py | 8 +- .../tests/{ => datasets}/test_datasets.py | 10 +- .../{ => datasets}/test_datasets_async.py | 10 +- .../{ => deployments}/test_deployments.py | 8 +- .../test_deployments_async.py | 8 +- .../tests/files/test_files.py | 87 + .../tests/files/test_files_async.py | 88 + .../tests/{ => indexes}/test_indexes.py | 8 +- .../tests/{ => indexes}/test_indexes_async.py | 8 +- .../tests/{ => inference}/test_inference.py | 18 +- .../{ => inference}/test_inference_async.py | 14 +- .../tests/{ => redteams}/test_redteams.py | 8 +- .../{ => redteams}/test_redteams_async.py | 8 +- .../tests/samples/test_samples.py | 2 +- .../tests/{ => telemetry}/test_telemetry.py | 12 +- .../{ => telemetry}/test_telemetry_async.py | 12 +- sdk/ai/azure-ai-projects/tests/test_agents.py | 76 - .../tests/test_agents_async.py | 76 - sdk/ai/azure-ai-projects/tests/test_base.py | 173 +- .../tests/test_data/files/test_file.jsonl | 10 + sdk/ai/azure-ai-projects/tsp-location.yaml | 4 +- 152 files changed, 38754 insertions(+), 4455 deletions(-) delete mode 100644 sdk/ai/azure-ai-projects/AGENTS_MIGRATION_GUIDE.md create mode 100644 sdk/ai/azure-ai-projects/azure/ai/projects/_types.py create mode 100644 sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/__init__.py create mode 100644 sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_ai_project_instrumentor.py create mode 100644 sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_trace_function.py create mode 100644 sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_utils.py delete mode 100644 sdk/ai/azure-ai-projects/samples/agents/README.md create mode 100644 sdk/ai/azure-ai-projects/samples/agents/assets/cua_browser_search.png create mode 100644 sdk/ai/azure-ai-projects/samples/agents/assets/cua_search_results.png create mode 100644 sdk/ai/azure-ai-projects/samples/agents/assets/cua_search_typed.png create mode 100644 sdk/ai/azure-ai-projects/samples/agents/assets/product_info.md create mode 100644 sdk/ai/azure-ai-projects/samples/agents/assets/synthetic_500_quarterly_results.csv create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_basic.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_basic_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_crud.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_file_search_in_stream_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_responses_code_interpreter.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_responses_function_tool_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agent_retrieve_basic.py delete mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agents.py delete mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_agents_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_container_app_agent_basic.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_container_app_agent_basic_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_conversation_crud.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_conversation_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_responses_basic.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_responses_basic_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_responses_stream_manager.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/sample_responses_streaming.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/telemetry/sample_agent_basic_with_azure_monitor_tracing.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/telemetry/sample_agent_basic_with_console_tracing.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/telemetry/sample_agent_basic_with_console_tracing_custom_attributes.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/computer_use_util.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_agent_file_search.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_agent_file_search_in_stream.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_agent_responses_function_tool.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_agent_web_search.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_computer_use.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_computer_use_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_image_generation.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_image_generation_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_mcp.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/tools/sample_responses_mcp_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/sample_agent_code_interpreter.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/sample_responses_structured_output.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/sample_responses_text_generation.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/samples_responses_conversation.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/samples_responses_image_input.py create mode 100644 sdk/ai/azure-ai-projects/samples/agents/under_development/samples_responses_websearch.py delete mode 100644 sdk/ai/azure-ai-projects/samples/evaluation/data_folder/sample_data_evaluation.jsonl delete mode 100644 sdk/ai/azure-ai-projects/samples/evaluation/sample_agent_evaluations.py delete mode 100644 sdk/ai/azure-ai-projects/samples/evaluation/sample_evaluations.py delete mode 100644 sdk/ai/azure-ai-projects/samples/evaluation/sample_evaluations_aoai_graders.py delete mode 100644 sdk/ai/azure-ai-projects/samples/evaluation/sample_evaluations_async.py create mode 100644 sdk/ai/azure-ai-projects/samples/files/data/test_file.jsonl create mode 100644 sdk/ai/azure-ai-projects/samples/files/sample_files.py create mode 100644 sdk/ai/azure-ai-projects/samples/files/sample_files_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/telemetry/gen_ai_trace_verifier.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/telemetry/memory_trace_exporter.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/telemetry/test_ai_agents_instrumentor.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/telemetry/test_ai_agents_instrumentor_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/telemetry/test_ai_instrumentor_base.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_agent_responses_crud.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_agent_responses_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_agents_crud.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_agents_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_container_app_agents.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_container_app_agents_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_conversation_crud.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_conversation_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_conversation_items_crud.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_conversation_items_crud_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_hosted_agents.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_responses.py create mode 100644 sdk/ai/azure-ai-projects/tests/agents/test_responses_async.py rename sdk/ai/azure-ai-projects/tests/{ => connections}/test_connections.py (88%) rename sdk/ai/azure-ai-projects/tests/{ => connections}/test_connections_async.py (90%) rename sdk/ai/azure-ai-projects/tests/{ => datasets}/test_datasets.py (96%) rename sdk/ai/azure-ai-projects/tests/{ => datasets}/test_datasets_async.py (96%) rename sdk/ai/azure-ai-projects/tests/{ => deployments}/test_deployments.py (87%) rename sdk/ai/azure-ai-projects/tests/{ => deployments}/test_deployments_async.py (88%) create mode 100644 sdk/ai/azure-ai-projects/tests/files/test_files.py create mode 100644 sdk/ai/azure-ai-projects/tests/files/test_files_async.py rename sdk/ai/azure-ai-projects/tests/{ => indexes}/test_indexes.py (92%) rename sdk/ai/azure-ai-projects/tests/{ => indexes}/test_indexes_async.py (92%) rename sdk/ai/azure-ai-projects/tests/{ => inference}/test_inference.py (89%) rename sdk/ai/azure-ai-projects/tests/{ => inference}/test_inference_async.py (91%) rename sdk/ai/azure-ai-projects/tests/{ => redteams}/test_redteams.py (89%) rename sdk/ai/azure-ai-projects/tests/{ => redteams}/test_redteams_async.py (90%) rename sdk/ai/azure-ai-projects/tests/{ => telemetry}/test_telemetry.py (77%) rename sdk/ai/azure-ai-projects/tests/{ => telemetry}/test_telemetry_async.py (78%) delete mode 100644 sdk/ai/azure-ai-projects/tests/test_agents.py delete mode 100644 sdk/ai/azure-ai-projects/tests/test_agents_async.py create mode 100644 sdk/ai/azure-ai-projects/tests/test_data/files/test_file.jsonl diff --git a/sdk/ai/azure-ai-projects/.env.template b/sdk/ai/azure-ai-projects/.env.template index 5fc39ab1e54c..73f70bea54b9 100644 --- a/sdk/ai/azure-ai-projects/.env.template +++ b/sdk/ai/azure-ai-projects/.env.template @@ -9,12 +9,31 @@ # 3. Run the tests (`pytest`) or run samples in the `samples` folder # +####################################################################### +# # Used in samples +# # Project endpoint has the format: # `https://.services.ai.azure.com/api/projects/` AZURE_AI_PROJECT_ENDPOINT= AZURE_AI_MODEL_DEPLOYMENT_NAME= +CONNECTION_NAME= -# Used in tests +####################################################################### +# +# Used tests, excluding Agent tests AZURE_AI_PROJECTS_TESTS_PROJECT_ENDPOINT= +# Used in Agent tests +AZURE_AI_PROJECTS_TESTS_AGENTS_PROJECT_ENDPOINT= + +# Used in tracing tests +AZURE_AI_PROJECTS_TESTS_TRACING_PROJECT_ENDPOINT= + +# Used in Container App Agents tests +AZURE_AI_PROJECTS_TESTS_CONTAINER_PROJECT_ENDPOINT= +AZURE_AI_PROJECTS_TESTS_CONTAINER_APP_RESOURCE_ID= +AZURE_AI_PROJECTS_TESTS_CONTAINER_INGRESS_SUBDOMAIN_SUFFIX= + + + diff --git a/sdk/ai/azure-ai-projects/AGENTS_MIGRATION_GUIDE.md b/sdk/ai/azure-ai-projects/AGENTS_MIGRATION_GUIDE.md deleted file mode 100644 index 696535277984..000000000000 --- a/sdk/ai/azure-ai-projects/AGENTS_MIGRATION_GUIDE.md +++ /dev/null @@ -1,519 +0,0 @@ -# Agents migration guide from Hub-based projects to Endpoint-based projects - -This guide describes migration from hub-based to Endpoint-based projects. To create a Endpoint-based project, please use one of the deployment scripts on [foundry samples repository](https://github.com/azure-ai-foundry/foundry-samples/tree/main/samples/microsoft/infrastructure-setup) appropriate for your scenario, also you can use Azure AI Foundry UI. The support of hub-based projects was dropped in `azure-ai-projects` version `1.0.0b11`. In this document, we show the operation implementation of before `1.0.0b11` in **Hub-based** section, followed by code for `azure-ai-projects` version `1.0.0b11` or later in **Endpoint-based**. - -## Import changes - -| Hub-based | Endpoint-based | -|-|-| -| `azure.ai.projects` | `azure.ai.projects` | -| `azure.ai.projects.models` | `azure.ai.agents.models` | -| Agents were moved to a new package. | `azure.ai.agents` | - -## Class structure changes - -Agents Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_agent` | `project_client.agents.create_agent` | -| `project_client.agents.list_agents` | `project_client.agents.list_agents` | -| `project_client.agents.get_agent` | `project_client.agents.get_agent` | -| `project_client.agents.update_agent` | `project_client.agents.update_agent` | -| `project_client.agents.delete_agents` | `project_client.agents.delete_agent` | -| `project_client.agents.create_thread_and_run` | `project_client.agents.create_thread_and_run` | -| `project_client.agents.enable_auto_function_calls` | `project_client.agents.enable_auto_function_calls` | -| The new method was added in new SDK version. | `project_client.agents.create_thread_and_process_run` | - -Threads Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_thread` | `project_client.agents.threads.create` | -| `project_client.agents.get_thread` | `project_client.agents.threads.get` | -| `project_client.agents.update_thread` | `project_client.agents.threads.update` | -| `project_client.agents.list_threads` | `project_client.agents.threads.list` | -| `project_client.agents.delete_thread` | `project_client.agents.threads.delete` | - -Messages Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_message` | `project_client.agents.messages.create` | -| `project_client.agents.list_messages` | `project_client.agents.messages.list` | -| `project_client.agents.get_message` | `project_client.agents.messages.get` | -| `project_client.agents.update_message` | `project_client.agents.messages.update` | -| `OpenAIPageableListOfThreadMessage.get_last_message_by_role` | `project_client.agents.messages.get_last_message_by_role` | -| `OpenAIPageableListOfThreadMessage.get_last_text_message_by_role` | `project_client.agents.messages.get_last_message_text_by_role` | - -Runs Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_run` | `project_client.agents.runs.create` | -| `project_client.agents.get_run` | `project_client.agents.runs.get` | -| `project_client.agents.list_run` | `project_client.agents.runs.list` | -| `project_client.agents.update_run` | `project_client.agents.runs.update` | -| `project_client.agents.create_and_process_run` | `project_client.agents.runs.create_and_process` | -| `project_client.agents.create_stream` | `project_client.agents.runs.stream` | -| `project_client.agents.submit_tool_outputs_to_run` | `project_client.agents.runs.submit_tool_outputs` | -| `project_client.agents.submit_tool_outputs_to_run` | `project_client.agents.runs.submit_tool_outputs_stream` | -| `project_client.agents.cancel_run` | `project_client.agents.runs.cancel` | - -Run Steps Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.get_run_step` | `project_client.agents.run_steps.get` | -| `project_client.agents.list_run_steps` | `project_client.agents.run_steps.list` | - -Vector Stores Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_vector_store_and_poll` | `project_client.agents.vector_stores.create_and_poll | -| `project_client.agents.create_vector_store` | `project_client.agents.vector_stores.create | -| `project_client.agents.list_vector_stores` | `project_client.agents.vector_stores.list | -| `project_client.agents.get_vector_store` | `project_client.agents.vector_stores.get | -| `project_client.agents.modify_vector_store` | `project_client.agents.vector_stores.modify | -| `project_client.agents.delete_vector_store` | `project_client.agents.vector_stores.delete | - -Vector Store Files Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_vector_store_file_and_poll` | `project_client.agents.vector_store_files.create_and_poll` | -| `project_client.agents.list_vector_store_files` | `project_client.agents.vector_store_files.list` | -| `project_client.agents.create_vector_store_file` | `project_client.agents.vector_store_files.create` | -| `project_client.agents.get_vector_store_file` | `project_client.agents.vector_store_files.get` | -| `project_client.agents.delete_vector_store_file` | `project_client.agents.vector_store_files.delete` | - -Vector Store File Batches Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.create_vector_store_file_and_poll` | `project_client.agents.vector_store_file_batches.create_and_poll`| -| `project_client.agents.create_vector_store_file_batch` | `project_client.agents.vector_store_file_batches.create`| -| `project_client.agents.get_vector_store_file_batch` | `project_client.agents.vector_store_file_batches.get`| -| `project_client.agents.list_vector_store_file_batch_files` | `project_client.agents.vector_store_file_batches.list_files`| -| `project_client.agents.cancel_vector_store_file_batch` | `project_client.agents.vector_store_file_batches.cancel`| - -Files Operations - -| Hub-based | Endpoint-based | -|-|-| -| `project_client.agents.upload_file_and_poll` | `project_client.agents.files.upload_and_poll` | -| `project_client.agents.upload_file` | `project_client.agents.files.upload` | -| `project_client.agents.save_file` | `project_client.agents.files.save` | -| `project_client.agents.get_file` | `project_client.agents.files.get` | -| `project_client.agents.list_files` | `project_client.agents.files.list` | -| `project_client.agents.delete_file` | `project_client.agents.files.delete` | - -## API changes - -1. Create project. The connection string is replaced by the endpoint. The project endpoint URL has the form https://\.services.ai.azure.com/api/projects/\. It can be found in your Azure AI Foundry Project overview page. - - **Hub-based** - - ```python - project_client = AIProjectClient.from_connection_string( - credential=DefaultAzureCredential(), - conn_str=connection_string, - ) - ``` - - **Endpoint-based** - - ```python - project_client = AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential()) - ``` - -2. Crate an agent. In the new versions of SDK, the agent can be created using project client or directly created by using `AgentsClient` constructor. In the code below, `project_client.agents`is an `AgentsClient` instance so `project_client.agents` and `agents_client` can be used interchangeably. For simplicity we will use ` project_client.agents `. - - **Hub-based** - - ```python - agent = project_client.agents.create_agent( - model= "gpt-4o", - name="my-assistant", - instructions="You are helpful assistant", - ) - ``` - - **Endpoint-based** - - Agent is instantiated using `AIProjectClient` - - ```python - agent = project_client.agents.create_agent( - model="gpt-4o", - name="my-agent", - instructions="You are helpful agent", - ) - ``` - - Agent is instantiated using `AgentsClient` constructor: - - ```python - from azure.ai.agents import AgentsClient - - agents_client = AgentsClient( - endpoint=connection_string, - credential=DefaultAzureCredential(), - ) - agent = agents_client.create_agent( - model="gpt-4o", - name="my-agent", - instructions="You are helpful agent", - ) - ``` - -3. List agents. New version of SDK allows more convenient ways of listing threads, messages and agents by returning `ItemPaged` and `AsyncItemPaged`. The list of returned items is split by pages, which may be consequently returned to user. Below we will demonstrate this mechanism for agents. The `limit` parameter defines the number of items on the page. This example is also applicable for listing threads, runs, run steps, vector stores, files in vector store, and messages. - - **Hub-based** - - ```python - has_more = True - last_id = None - while has_more: - agents_list = project_client.agents.list_agents(after=last_id) - for agent in agents_list.data: - print(agent.id) - has_more = agents_list.has_more - last_id = agents_list.last_id - ``` - - **Endpoint-based** - - ```python - agents = project_client.agents.list_agents(limit=2) - # Iterate items by page. Each page will be limited by two items. - for i, page in enumerate(agents.by_page()): - print(f"Items on page {i}") - for one_agent in page: - print(one_agent.id) - - # Iterate over all agents. Note, the agent list object needs to be re instantiated, the same object cannot be reused after iteration. - agents = project_client.agents.list_agents(limit=2) - for one_agent in agents: - print(one_agent.id) - ``` - -4. Delete agent. In versions azure-ai-projects 1.0.0b11, all deletion operations used to return deletion status, for example, deletion of agent was returning `AgentDeletionStatus`. In 1.0.0b11 and later, these operations do not return a value. - - **Hub-based** - - ```python - deletion_status = project_client.agents.delete_agent(agent.id) - print(deletion_status.deleted) - ``` - - **Endpoint-based** - - ```python - project_client.agents.delete_agent(agent.id) - ``` - -5. Create a thread. - - **Hub-based** - - ```python - thread = project_client.agents.create_thread() - ``` - - **Endpoint-based** - - ```python - thread = project_client.agents.threads.create() - ``` - -6. List threads. - - **Hub-based** - - ```python - with project_client: - last_id = None - has_more = True - page = 0 - while has_more: - threads = project_client.agents.list_threads(limit=2, after=last_id) - print(f"Items on page {page}") - for thread in threads.data: - print(thread.id) - has_more = threads.has_more - last_id = threads.last_id - page += 1 - ``` - - **Endpoint-based** - - ```python - threads = project_client.agents.threads.list(limit=2) - # Iterate items by page. Each page will be limited by two items. - for i, page in enumerate(threads.by_page()): - print(f"Items on page {i}") - for thread in page: - print(thread.id) - - # Iterate over all threads. Note, the thread list object needs to be re-instantiated, the same object cannot be reused after iteration. - threads = project_client.agents.threads.list(limit=2) - for thread in threads: - print(thread.id) - ``` - -7. Delete the thread. In previous SDK thread deletion used to return ` ThreadDeletionStatus` object, while in new version it does not return value. - - **Hub-based** - - ```python - delete_status = project_client.agents.delete_thread(tread_id) - print(delete_status.deleted) - ``` - - **Endpoint-based** - - ```python - project_client.agents.threads.delete(tread_id) - ``` - -8. Create the message on a thread. - - **Hub-based** - - ```python - message = project_client.agents.create_message(thread_id=thread.id, role="user", content="The message text.") - ``` - - **Endpoint-based** - - ```python - message = agents_client.messages.create(thread_id=thread.id, role="user", content=" The message text."") - ``` - -9. Create and get the run. - - **Hub-based** - - ```python - run = project_client.agents.runs.create(thread_id=thread.id, agent_id=agent.id) - run = project_client.agents.get_run(thread_id=thread.id, run_id=run.id) - ``` - - **Endpoint-based** - - ```python - run = project_client.agents.runs.create(thread_id=thread.id, agent_id=agent.id) - run = project_client.agents.runs.get(thread_id=thread.id, run_id=run.id) - ``` - -10. List Runs. - - **Hub-based** - - ```python - has_more = True - last_id = None - while has_more: - runs_list = project_client.agents.list_runs(thread.id) - for one_run in runs_list.data: - print(one_run.id) - has_more = runs_list.has_more - last_id = runs_list.last_id - ``` - - **Endpoint-based** - - ```python - runs = project_client.agents.runs.list(thread.id) - for one_run in runs: - print(one_run.id) - ``` - -11. List Run steps. - - **Hub-based** - - ```python - has_more = True - last_id = None - while has_more: - runs_step_list = project_client.agents.list_run_steps(thread.id, run.id) - for one_run_step in runs_step_list.data: - print(one_run_step.id) - has_more = runs_step_list.has_more - last_id = runs_step_list.last_id - ``` - - **Endpoint-based** - - ```python - run_steps = project_client.agents.run_steps.list(thread.id, run.id) - for one_run_step in run_steps: - print(one_run_step.id) - ``` - -12. Using streams. - - **Hub-based** - - ```python - with project_client.agents.create_stream(thread_id=thread.id, agent_id=agent.id) as stream: - for event_type, event_data, func_return in stream: - print(f"Received data.") - print(f"Streaming receive Event Type: {event_type}") - print(f"Event Data: {str(event_data)[:100]}...") - print(f"Event Function return: {func_return}\n") - ``` - - **Endpoint-based** - - ```python - with project_client.agents.runs.stream(thread_id=thread.id, agent_id=agent.id, event_handler=MyEventHandler()) as stream: - for event_type, event_data, func_return in stream: - print(f"Received data.") - print(f"Streaming receive Event Type: {event_type}") - print(f"Event Data: {str(event_data)[:100]}...") - print(f"Event Function return: {func_return}\n") - ``` - -13. List messages. - - **Hub-based** - - ```python - messages = project_client.agents.list_messages(thread_id=thread.id) - # In code below we assume that the number of messages fits one page for brevity. - for data_point in reversed(messages.data): - last_message_content = data_point.content[-1] - if isinstance(last_message_content, MessageTextContent): - print(f"{data_point.role}: {last_message_content.text.value}") - ``` - - **Endpoint-based** - - ```python - messages = project_client.agents.messages.list(thread_id=thread.id) - for msg in messages: - if msg.text_messages: - last_text = msg.text_messages[-1] - print(f"{msg.role}: {last_text.text.value}") - ``` - -14. Create, list and delete files are now handled by file operations, again, delete call in new SDK version does not return a value. - - **Hub-based** - - ```python - # Create file - file = project_client.agents.upload_file_and_poll(file_path="product_info_1.md", purpose=FilePurpose.AGENTS) - # List and enumerate files - files = project_client.agents.list_files() - for one_file in files.data: - print(one_file.id) - # Delete file. - delete_status = project_client.agents.delete_file(file.id) - print(delete_status.deleted) - ``` - - **Endpoint-based** - - ```python - # Create file - file = project_client.agents.files.upload_and_poll(file_path=asset_file_path, purpose=FilePurpose.AGENTS) - # List and enumerate files - files = project_client.agents.files.list() - for one_file in files.data: - print(one_file.id) - # Delete file. - project_client.agents.files.delete(file_id=file.id) - ``` - -15. Create, list vector store files list and delete vector stores. - - **Hub-based** - - ```python - # Create a vector store with no file and wait for it to be processed - vector_store = project_client.agents.create_vector_store_and_poll(file_ids=[file.id], name="sample_vector_store") - # List vector stores - has_more = True - last_id = None - while has_more: - vector_store_list = project_client.agents.list_vector_stores(after=last_id) - for one_vector_store in vector_store_list.data: - print(one_vector_store.id) - has_more = vector_store_list.has_more - last_id = vector_store_list.last_id - # List files in the vector store. - has_more = True - last_id = None - while has_more: - vector_store_file_list = project_client.agents.list_vector_store_files(vector_store.id, after=last_id) - for one_file in vector_store_file_list.data: - print(one_file.id) - has_more = vector_store_file_list.has_more - last_id = vector_store_file_list.last_id - # Delete file from vector store - project_client.agents.delete_vector_store_file(vector_store.id, file.id) - # Delete vector store. - deletion_status = project_client.agents.delete_vector_store(vector_store.id) - print(deletion_status.deleted) - ``` - - **Endpoint-based** - - ```python - # Create a vector store with no file and wait for it to be processed - vector_store = project_client.agents.vector_stores.create_and_poll(file_ids=[file.id], name="my_vectorstore") - # List vector stores - vector_store_list = project_client.agents.vector_stores.list() - for one_vector_store in vector_store_list: - print(one_vector_store.id) - # List files in the vector store. - vector_store_file_list = project_client.agents.vector_store_files.list(vector_store.id) - for one_file in vector_store_file_list: - print(one_file.id) - # Delete file from vector store - project_client.agents.vector_store_files.delete(vector_store.id, file.id) - # Delete vector store. - project_client.agents.vector_stores.delete(vector_store.id) - ``` - -16. Vector store batch file search. - - **Hub-based** - - ```python - # Batch upload files - vector_store_file_batch = project_client.agents.create_vector_store_file_batch_and_poll( - vector_store_id=vector_store.id, file_ids=[file.id] - ) - # List file in the batch - has_more = True - last_id = None - while has_more: - files = project_client.agents.list_vector_store_file_batch_files(vector_store.id, vector_store_file_batch.id, after=last_id) - for one_file in files.data: - print(one_file.id) - has_more = files.has_more - last_id = files.last_id - # Try to cancel batch upload - vector_store_file_batch = project_client.agents.cancel_vector_store_file_batch(vector_store.id, vector_store_file_batch.id) - ``` - - **Endpoint-based** - - ```python - # Batch upload files - vector_store_file_batch = project_client.agents.vector_store_file_batches.create_and_poll( - vector_store_id=vector_store.id, file_ids=[file.id] - ) - # List file in the batch - files = project_client.agents.vector_store_file_batches.list_files(vector_store.id, vector_store_file_batch.id) - for one_file in files: - print(one_file.id) - # Try to cancel batch upload - project_client.agents.vector_store_file_batches.cancel(vector_store.id, vector_store_file_batch.id) - ``` diff --git a/sdk/ai/azure-ai-projects/CHANGELOG.md b/sdk/ai/azure-ai-projects/CHANGELOG.md index 40dbda59cfe7..7d60d148c92a 100644 --- a/sdk/ai/azure-ai-projects/CHANGELOG.md +++ b/sdk/ai/azure-ai-projects/CHANGELOG.md @@ -1,9 +1,12 @@ # Release History -## 1.1.0b5 (Unreleased) +## 2.0.0b1 (Unreleased) ### Features added +### Sample updates +* Added `files` samples for operations create, delete, list, retrieve and content. + ## 1.1.0b4 (2025-09-12) ### Bugs Fixed diff --git a/sdk/ai/azure-ai-projects/README.md b/sdk/ai/azure-ai-projects/README.md index c181f3755d34..76071606db1d 100644 --- a/sdk/ai/azure-ai-projects/README.md +++ b/sdk/ai/azure-ai-projects/README.md @@ -4,14 +4,14 @@ The AI Projects client library (in preview) is part of the Azure AI Foundry SDK, resources in your Azure AI Foundry Project. Use it to: * **Create and run Agents** using methods on the `.agents` client property. -* **Get an AzureOpenAI client** using the `.get_openai_client()` client method. +* **Get an AzureOpenAI client** using the `.get_openai_client_legacy()` client method. * **Run Evaluations** to assess the performance of generative AI applications, using the `.evaluations` operations. * **Enumerate AI Models** deployed to your Foundry Project using the `.deployments` operations. * **Enumerate connected Azure resources** in your Foundry project using the `.connections` operations. * **Upload documents and create Datasets** to reference them using the `.datasets` operations. * **Create and enumerate Search Indexes** using methods the `.indexes` operations. -The client library uses version `2025-05-15-preview` of the AI Foundry [data plane REST APIs](https://aka.ms/azsdk/azure-ai-projects/rest-api-reference). +The client library uses version `2025-11-15-preview` of the AI Foundry [data plane REST APIs](https://aka.ms/azsdk/azure-ai-projects/rest-api-reference). [Product documentation](https://aka.ms/azsdk/azure-ai-projects/product-doc) | [Samples][samples] @@ -94,21 +94,50 @@ The `.agents` property on the `AIProjectsClient` gives you access to an authenti The code below assumes `model_deployment_name` (a string) is defined. It's the deployment name of an AI model in your Foundry Project, as shown in the "Models + endpoints" tab, under the "Name" column. - + ```python -agent = project_client.agents.create_agent( - model=model_deployment_name, - name="my-agent", - instructions="You are helpful agent", +openai_client = project_client.get_openai_client() + +agent = project_client.agents.create_version( + agent_name="MyAgent", + definition=PromptAgentDefinition( + model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"], + instructions="You are a helpful assistant that answers general questions", + ), ) -print(f"Created agent, agent ID: {agent.id}") +print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})") -# Do something with your Agent! -# See samples here https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/ai/azure-ai-agents/samples +conversation = openai_client.conversations.create( + items=[{"type": "message", "role": "user", "content": "What is the size of France in square miles?"}], +) +print(f"Created conversation with initial user message (id: {conversation.id})") + +response = openai_client.responses.create( + conversation=conversation.id, + extra_body={"agent": {"name": agent.name, "type": "agent_reference"}}, + input="", # TODO: Remove 'input' once service is fixed +) +print(f"Response output: {response.output_text}") + +openai_client.conversations.items.create( + conversation_id=conversation.id, + items=[{"type": "message", "role": "user", "content": "And what is the capital city?"}], +) +print(f"Added a second user message to the conversation") -project_client.agents.delete_agent(agent.id) -print("Deleted agent") +response = openai_client.responses.create( + conversation=conversation.id, + extra_body={"agent": {"name": agent.name, "type": "agent_reference"}}, + input="", # TODO: Remove 'input' once service is fixed +) +print(f"Response output: {response.output_text}") + +openai_client.conversations.delete(conversation_id=conversation.id) +print("Conversation deleted") + +project_client.agents.delete_version(agent_name=agent.name, agent_version=agent.version) +print("Agent deleted") ``` @@ -136,7 +165,7 @@ Update the `api_version` value with one found in the "Data plane - inference" ro print( "Get an authenticated Azure OpenAI client for the parent AI Services resource, and perform a chat completion operation:" ) -with project_client.get_openai_client(api_version="2024-10-21") as client: +with project_client.get_openai_client_legacy(api_version="2024-10-21") as client: response = client.chat.completions.create( model=model_deployment_name, @@ -153,7 +182,9 @@ with project_client.get_openai_client(api_version="2024-10-21") as client: print( "Get an authenticated Azure OpenAI client for a connected Azure OpenAI service, and perform a chat completion operation:" ) -with project_client.get_openai_client(api_version="2024-10-21", connection_name=connection_name) as client: +with project_client.get_openai_client_legacy( + api_version="2024-10-21", connection_name=connection_name +) as client: response = client.chat.completions.create( model=model_deployment_name, @@ -180,7 +211,7 @@ See the "inference" folder in the [package samples][samples] for additional samp print( "Get an authenticated Azure OpenAI client for the parent AI Services resource, and perform a 'responses' operation:" ) -with project_client.get_openai_client(api_version="2025-04-01-preview") as client: +with project_client.get_openai_client_legacy(api_version="2025-04-01-preview") as client: response = client.responses.create( model=model_deployment_name, @@ -192,7 +223,7 @@ with project_client.get_openai_client(api_version="2025-04-01-preview") as clien print( "Get an authenticated Azure OpenAI client for a connected Azure OpenAI service, and perform a 'responses' operation:" ) -with project_client.get_openai_client( +with project_client.get_openai_client_legacy( api_version="2025-04-01-preview", connection_name=connection_name ) as client: @@ -337,6 +368,37 @@ project_client.datasets.delete(name=dataset_name, version=dataset_version_2) +### Files operations + +The code below shows some Files operations using the OpenAI client, which allow you to upload, retrieve, list, and delete files. These operations are useful for working with files that can be used for fine-tuning and other AI model operations. Full samples can be found under the "files" folder in the [package samples][samples]. + + + +```python +print("Uploading file") +with open(file_path, "rb") as f: + uploaded_file = openai_client.files.create(file=f, purpose="fine-tune") +print(uploaded_file) + +print(f"Retrieving file metadata with ID: {uploaded_file.id}") +retrieved_file = openai_client.files.retrieve(uploaded_file.id) +print(retrieved_file) + +print(f"Retrieving file content with ID: {uploaded_file.id}") +file_content = openai_client.files.content(uploaded_file.id) +print(file_content.content) + +print("Listing all files:") +for file in openai_client.files.list(): + print(file) + +print(f"Deleting file with ID: {uploaded_file.id}") +deleted_file = openai_client.files.delete(uploaded_file.id) +print(f"Successfully deleted file: {deleted_file.id}") +``` + + + ### Indexes operations The code below shows some Indexes operations. Full samples can be found under the "indexes" @@ -379,70 +441,9 @@ Evaluation in Azure AI Project client library provides quantitive, AI-assisted q The code below shows some evaluation operations. Full list of sample can be found under "evaluation" folder in the [package samples][samples] - - -```python -print("Upload a single file and create a new Dataset to reference the file.") -dataset: DatasetVersion = project_client.datasets.upload_file( - name=dataset_name, - version=dataset_version, - file_path=data_file, - connection_name=connection_name, -) -print(dataset) - -print("Create an evaluation") -evaluation: Evaluation = Evaluation( - display_name="Sample Evaluation Test", - description="Sample evaluation for testing", - # Sample Dataset Id : azureai://accounts//projects//data//versions/ - data=InputDataset(id=dataset.id if dataset.id else ""), - evaluators={ - "relevance": EvaluatorConfiguration( - id=EvaluatorIds.RELEVANCE.value, - init_params={ - "deployment_name": model_deployment_name, - }, - data_mapping={ - "query": "${data.query}", - "response": "${data.response}", - }, - ), - "violence": EvaluatorConfiguration( - id=EvaluatorIds.VIOLENCE.value, - init_params={ - "azure_ai_project": endpoint, - }, - ), - "bleu_score": EvaluatorConfiguration( - id=EvaluatorIds.BLEU_SCORE.value, - ), - }, -) - -evaluation_response: Evaluation = project_client.evaluations.create( - evaluation, - headers={ - "model-endpoint": model_endpoint, - "model-api-key": model_api_key, - }, -) -print(evaluation_response) - -print("Get evaluation") -get_evaluation_response: Evaluation = project_client.evaluations.get(evaluation_response.name) -print(get_evaluation_response) - -print("List evaluations") -for evaluation in project_client.evaluations.list(): - print(evaluation) -``` - - - ## Tracing -The AI Projects client library can be configured to emit OpenTelemetry traces for all its REST API calls. These can be viewed in the "Tracing" tab in your AI Foundry Project page, once you add an Application Insights resource and configured your application appropriately. Agent operations (via the `.agents` property) can also be instrumented, as well as OpenAI client library operations (client created by calling `get_openai_client()` method). For local debugging purposes, traces can also be omitted to the console. For more information see: +The AI Projects client library can be configured to emit OpenTelemetry traces for all its REST API calls. These can be viewed in the "Tracing" tab in your AI Foundry Project page, once you add an Application Insights resource and configured your application appropriately. Agent operations (via the `.agents` property) can also be instrumented, as well as OpenAI client library operations (client created by calling `get_openai_client_legacy()` method). For local debugging purposes, traces can also be omitted to the console. For more information see: * [Trace AI applications using OpenAI SDK](https://learn.microsoft.com/azure/ai-foundry/how-to/develop/trace-application) * Chat-completion samples with console or Azure Monitor tracing enabled. See `samples\inference\azure-openai` folder. diff --git a/sdk/ai/azure-ai-projects/_metadata.json b/sdk/ai/azure-ai-projects/_metadata.json index 253921f335be..509044270b48 100644 --- a/sdk/ai/azure-ai-projects/_metadata.json +++ b/sdk/ai/azure-ai-projects/_metadata.json @@ -1,3 +1,3 @@ { - "apiVersion": "2025-05-15-preview" + "apiVersion": "2025-11-15-preview" } \ No newline at end of file diff --git a/sdk/ai/azure-ai-projects/apiview-properties.json b/sdk/ai/azure-ai-projects/apiview-properties.json index 05483816b0d9..5486ae1be8cc 100644 --- a/sdk/ai/azure-ai-projects/apiview-properties.json +++ b/sdk/ai/azure-ai-projects/apiview-properties.json @@ -1,72 +1,462 @@ { "CrossLanguagePackageId": "Azure.AI.Projects", "CrossLanguageDefinitionId": { - "azure.ai.projects.models.AgentEvaluation": "Azure.AI.Projects.AgentEvaluation", - "azure.ai.projects.models.AgentEvaluationRedactionConfiguration": "Azure.AI.Projects.AgentEvaluationRedactionConfiguration", - "azure.ai.projects.models.AgentEvaluationRequest": "Azure.AI.Projects.AgentEvaluationRequest", - "azure.ai.projects.models.AgentEvaluationResult": "Azure.AI.Projects.AgentEvaluationResult", - "azure.ai.projects.models.AgentEvaluationSamplingConfiguration": "Azure.AI.Projects.AgentEvaluationSamplingConfiguration", + "azure.ai.projects.models.Tool": "OpenAI.Tool", + "azure.ai.projects.models.A2ATool": "Azure.AI.Projects.A2ATool", + "azure.ai.projects.models.InsightResult": "Azure.AI.Projects.InsightResult", + "azure.ai.projects.models.AgentClusterInsightResult": "Azure.AI.Projects.AgentClusterInsightResult", + "azure.ai.projects.models.InsightRequest": "Azure.AI.Projects.InsightRequest", + "azure.ai.projects.models.AgentClusterInsightsRequest": "Azure.AI.Projects.AgentClusterInsightsRequest", + "azure.ai.projects.models.AgentContainerObject": "Azure.AI.Projects.AgentContainerObject", + "azure.ai.projects.models.AgentContainerOperationError": "Azure.AI.Projects.AgentContainerOperationError", + "azure.ai.projects.models.AgentContainerOperationObject": "Azure.AI.Projects.AgentContainerOperationObject", + "azure.ai.projects.models.AgentDefinition": "Azure.AI.Projects.AgentDefinition", "azure.ai.projects.models.BaseCredentials": "Azure.AI.Projects.BaseCredentials", + "azure.ai.projects.models.AgenticIdentityCredentials": "Azure.AI.Projects.AgenticIdentityCredentials", + "azure.ai.projects.models.AgentId": "Azure.AI.Projects.AgentId", + "azure.ai.projects.models.AgentObject": "Azure.AI.Projects.AgentObject", + "azure.ai.projects.models.AgentObjectVersions": "Azure.AI.Projects.AgentObject.versions.anonymous", + "azure.ai.projects.models.AgentReference": "Azure.AI.Projects.AgentReference", + "azure.ai.projects.models.EvaluationTaxonomyInput": "Azure.AI.Projects.EvaluationTaxonomyInput", + "azure.ai.projects.models.AgentTaxonomyInput": "Azure.AI.Projects.AgentTaxonomyInput", + "azure.ai.projects.models.AgentVersionObject": "Azure.AI.Projects.AgentVersionObject", + "azure.ai.projects.models.AISearchIndexResource": "Azure.AI.Projects.AISearchIndexResource", + "azure.ai.projects.models.Annotation": "OpenAI.Annotation", + "azure.ai.projects.models.AnnotationFileCitation": "OpenAI.AnnotationFileCitation", + "azure.ai.projects.models.AnnotationFilePath": "OpenAI.AnnotationFilePath", + "azure.ai.projects.models.AnnotationUrlCitation": "OpenAI.AnnotationUrlCitation", + "azure.ai.projects.models.ApiError": "Azure.AI.Projects.ApiError", + "azure.ai.projects.models.ApiErrorResponse": "Azure.AI.Projects.ApiErrorResponse", + "azure.ai.projects.models.ApiInnerError": "Azure.AI.Projects.ApiInnerError", "azure.ai.projects.models.ApiKeyCredentials": "Azure.AI.Projects.ApiKeyCredentials", - "azure.ai.projects.models.Message": "Azure.AI.Projects.Message", - "azure.ai.projects.models.AssistantMessage": "Azure.AI.Projects.AssistantMessage", + "azure.ai.projects.models.Location": "OpenAI.Location", + "azure.ai.projects.models.ApproximateLocation": "OpenAI.ApproximateLocation", + "azure.ai.projects.models.Target": "Azure.AI.Projects.Target", + "azure.ai.projects.models.AzureAIAgentTarget": "Azure.AI.Projects.AzureAIAgentTarget", + "azure.ai.projects.models.AzureAISearchAgentTool": "Azure.AI.Projects.AzureAISearchAgentTool", "azure.ai.projects.models.Index": "Azure.AI.Projects.Index", "azure.ai.projects.models.AzureAISearchIndex": "Azure.AI.Projects.AzureAISearchIndex", + "azure.ai.projects.models.AzureAISearchToolResource": "Azure.AI.Projects.AzureAISearchToolResource", + "azure.ai.projects.models.AzureFunctionAgentTool": "Azure.AI.Projects.AzureFunctionAgentTool", + "azure.ai.projects.models.AzureFunctionBinding": "Azure.AI.Projects.AzureFunctionBinding", + "azure.ai.projects.models.AzureFunctionDefinition": "Azure.AI.Projects.AzureFunctionDefinition", + "azure.ai.projects.models.AzureFunctionDefinitionFunction": "Azure.AI.Projects.AzureFunctionDefinition.function.anonymous", + "azure.ai.projects.models.AzureFunctionStorageQueue": "Azure.AI.Projects.AzureFunctionStorageQueue", "azure.ai.projects.models.TargetConfig": "Azure.AI.Projects.TargetConfig", "azure.ai.projects.models.AzureOpenAIModelConfiguration": "Azure.AI.Projects.AzureOpenAIModelConfiguration", + "azure.ai.projects.models.BingCustomSearchAgentTool": "Azure.AI.Projects.BingCustomSearchAgentTool", + "azure.ai.projects.models.BingCustomSearchConfiguration": "Azure.AI.Projects.BingCustomSearchConfiguration", + "azure.ai.projects.models.BingCustomSearchToolParameters": "Azure.AI.Projects.BingCustomSearchToolParameters", + "azure.ai.projects.models.BingGroundingAgentTool": "Azure.AI.Projects.BingGroundingAgentTool", + "azure.ai.projects.models.BingGroundingSearchConfiguration": "Azure.AI.Projects.BingGroundingSearchConfiguration", + "azure.ai.projects.models.BingGroundingSearchToolParameters": "Azure.AI.Projects.BingGroundingSearchToolParameters", "azure.ai.projects.models.BlobReference": "Azure.AI.Projects.BlobReference", "azure.ai.projects.models.BlobReferenceSasCredential": "Azure.AI.Projects.SasCredential", + "azure.ai.projects.models.BrowserAutomationAgentTool": "Azure.AI.Projects.BrowserAutomationAgentTool", + "azure.ai.projects.models.BrowserAutomationToolConnectionParameters": "Azure.AI.Projects.BrowserAutomationToolConnectionParameters", + "azure.ai.projects.models.BrowserAutomationToolParameters": "Azure.AI.Projects.BrowserAutomationToolParameters", + "azure.ai.projects.models.CaptureStructuredOutputsTool": "Azure.AI.Projects.CaptureStructuredOutputsTool", + "azure.ai.projects.models.ChartCoordinate": "Azure.AI.Projects.ChartCoordinate", + "azure.ai.projects.models.MemoryItem": "Azure.AI.Projects.MemoryItem", + "azure.ai.projects.models.ChatSummaryMemoryItem": "Azure.AI.Projects.ChatSummaryMemoryItem", + "azure.ai.projects.models.ClusterInsightResult": "Azure.AI.Projects.ClusterInsightResult", + "azure.ai.projects.models.ClusterTokenUsage": "Azure.AI.Projects.ClusterTokenUsage", + "azure.ai.projects.models.EvaluatorDefinition": "Azure.AI.Projects.EvaluatorDefinition", + "azure.ai.projects.models.CodeBasedEvaluatorDefinition": "Azure.AI.Projects.CodeBasedEvaluatorDefinition", + "azure.ai.projects.models.CodeInterpreterOutput": "OpenAI.CodeInterpreterOutput", + "azure.ai.projects.models.CodeInterpreterOutputImage": "OpenAI.CodeInterpreterOutputImage", + "azure.ai.projects.models.CodeInterpreterOutputLogs": "OpenAI.CodeInterpreterOutputLogs", + "azure.ai.projects.models.CodeInterpreterTool": "OpenAI.CodeInterpreterTool", + "azure.ai.projects.models.CodeInterpreterToolAuto": "OpenAI.CodeInterpreterToolAuto", + "azure.ai.projects.models.ItemParam": "OpenAI.ItemParam", + "azure.ai.projects.models.CodeInterpreterToolCallItemParam": "OpenAI.CodeInterpreterToolCallItemParam", + "azure.ai.projects.models.ItemResource": "OpenAI.ItemResource", + "azure.ai.projects.models.CodeInterpreterToolCallItemResource": "OpenAI.CodeInterpreterToolCallItemResource", + "azure.ai.projects.models.ComparisonFilter": "OpenAI.ComparisonFilter", + "azure.ai.projects.models.CompoundFilter": "OpenAI.CompoundFilter", + "azure.ai.projects.models.ComputerAction": "OpenAI.ComputerAction", + "azure.ai.projects.models.ComputerActionClick": "OpenAI.ComputerActionClick", + "azure.ai.projects.models.ComputerActionDoubleClick": "OpenAI.ComputerActionDoubleClick", + "azure.ai.projects.models.ComputerActionDrag": "OpenAI.ComputerActionDrag", + "azure.ai.projects.models.ComputerActionKeyPress": "OpenAI.ComputerActionKeyPress", + "azure.ai.projects.models.ComputerActionMove": "OpenAI.ComputerActionMove", + "azure.ai.projects.models.ComputerActionScreenshot": "OpenAI.ComputerActionScreenshot", + "azure.ai.projects.models.ComputerActionScroll": "OpenAI.ComputerActionScroll", + "azure.ai.projects.models.ComputerActionTypeKeys": "OpenAI.ComputerActionTypeKeys", + "azure.ai.projects.models.ComputerActionWait": "OpenAI.ComputerActionWait", + "azure.ai.projects.models.ComputerToolCallItemParam": "OpenAI.ComputerToolCallItemParam", + "azure.ai.projects.models.ComputerToolCallItemResource": "OpenAI.ComputerToolCallItemResource", + "azure.ai.projects.models.ComputerToolCallOutputItemOutput": "OpenAI.ComputerToolCallOutputItemOutput", + "azure.ai.projects.models.ComputerToolCallOutputItemOutputComputerScreenshot": "OpenAI.ComputerToolCallOutputItemOutputComputerScreenshot", + "azure.ai.projects.models.ComputerToolCallOutputItemParam": "OpenAI.ComputerToolCallOutputItemParam", + "azure.ai.projects.models.ComputerToolCallOutputItemResource": "OpenAI.ComputerToolCallOutputItemResource", + "azure.ai.projects.models.ComputerToolCallSafetyCheck": "OpenAI.ComputerToolCallSafetyCheck", + "azure.ai.projects.models.ComputerUsePreviewTool": "OpenAI.ComputerUsePreviewTool", "azure.ai.projects.models.Connection": "Azure.AI.Projects.Connection", + "azure.ai.projects.models.ContainerAppAgentDefinition": "Azure.AI.Projects.ContainerAppAgentDefinition", + "azure.ai.projects.models.EvaluationRuleAction": "Azure.AI.Projects.EvaluationRuleAction", + "azure.ai.projects.models.ContinuousEvaluationRuleAction": "Azure.AI.Projects.ContinuousEvaluationRuleAction", + "azure.ai.projects.models.Coordinate": "OpenAI.Coordinate", "azure.ai.projects.models.CosmosDBIndex": "Azure.AI.Projects.CosmosDBIndex", + "azure.ai.projects.models.CreatedBy": "Azure.AI.Projects.CreatedBy", + "azure.ai.projects.models.Trigger": "Azure.AI.Projects.Trigger", + "azure.ai.projects.models.CronTrigger": "Azure.AI.Projects.CronTrigger", "azure.ai.projects.models.CustomCredential": "Azure.AI.Projects.CustomCredential", + "azure.ai.projects.models.RecurrenceSchedule": "Azure.AI.Projects.RecurrenceSchedule", + "azure.ai.projects.models.DailyRecurrenceSchedule": "Azure.AI.Projects.DailyRecurrenceSchedule", "azure.ai.projects.models.DatasetCredential": "Azure.AI.Projects.AssetCredentialResponse", "azure.ai.projects.models.DatasetVersion": "Azure.AI.Projects.DatasetVersion", + "azure.ai.projects.models.DeleteAgentResponse": "Azure.AI.Projects.DeleteAgentResponse", + "azure.ai.projects.models.DeleteAgentVersionResponse": "Azure.AI.Projects.DeleteAgentVersionResponse", + "azure.ai.projects.models.DeleteMemoryStoreResponse": "Azure.AI.Projects.DeleteMemoryStoreResponse", "azure.ai.projects.models.Deployment": "Azure.AI.Projects.Deployment", - "azure.ai.projects.models.DeveloperMessage": "Azure.AI.Projects.DeveloperMessage", "azure.ai.projects.models.EmbeddingConfiguration": "Azure.AI.Projects.EmbeddingConfiguration", "azure.ai.projects.models.EntraIDCredentials": "Azure.AI.Projects.EntraIDCredentials", - "azure.ai.projects.models.Evaluation": "Azure.AI.Projects.Evaluation", - "azure.ai.projects.models.EvaluationTarget": "Azure.AI.Projects.EvaluationTarget", - "azure.ai.projects.models.EvaluatorConfiguration": "Azure.AI.Projects.EvaluatorConfiguration", + "azure.ai.projects.models.EvalCompareReport": "Azure.AI.Projects.EvalCompareReport", + "azure.ai.projects.models.EvalResult": "Azure.AI.Projects.EvalResult", + "azure.ai.projects.models.EvalRunResultCompareItem": "Azure.AI.Projects.EvalRunResultCompareItem", + "azure.ai.projects.models.EvalRunResultComparison": "Azure.AI.Projects.EvalRunResultComparison", + "azure.ai.projects.models.EvalRunResultSummary": "Azure.AI.Projects.EvalRunResultSummary", + "azure.ai.projects.models.EvaluationComparisonRequest": "Azure.AI.Projects.EvaluationComparisonRequest", + "azure.ai.projects.models.InsightSample": "Azure.AI.Projects.InsightSample", + "azure.ai.projects.models.EvaluationResultSample": "Azure.AI.Projects.EvaluationResultSample", + "azure.ai.projects.models.EvaluationRule": "Azure.AI.Projects.EvaluationRule", + "azure.ai.projects.models.EvaluationRuleFilter": "Azure.AI.Projects.EvaluationRuleFilter", + "azure.ai.projects.models.EvaluationRunClusterInsightResult": "Azure.AI.Projects.EvaluationRunClusterInsightResult", + "azure.ai.projects.models.EvaluationRunClusterInsightsRequest": "Azure.AI.Projects.EvaluationRunClusterInsightsRequest", + "azure.ai.projects.models.ScheduleTask": "Azure.AI.Projects.ScheduleTask", + "azure.ai.projects.models.EvaluationScheduleTask": "Azure.AI.Projects.EvaluationScheduleTask", + "azure.ai.projects.models.EvaluationTaxonomy": "Azure.AI.Projects.EvaluationTaxonomy", + "azure.ai.projects.models.EvaluatorMetric": "Azure.AI.Projects.EvaluatorMetric", + "azure.ai.projects.models.EvaluatorVersion": "Azure.AI.Projects.EvaluatorVersion", + "azure.ai.projects.models.FabricDataAgentToolParameters": "Azure.AI.Projects.FabricDataAgentToolParameters", "azure.ai.projects.models.FieldMapping": "Azure.AI.Projects.FieldMapping", "azure.ai.projects.models.FileDatasetVersion": "Azure.AI.Projects.FileDatasetVersion", + "azure.ai.projects.models.FileSearchTool": "OpenAI.FileSearchTool", + "azure.ai.projects.models.FileSearchToolCallItemParam": "OpenAI.FileSearchToolCallItemParam", + "azure.ai.projects.models.FileSearchToolCallItemParamResult": "OpenAI.FileSearchToolCallItemParam.result.anonymous", + "azure.ai.projects.models.FileSearchToolCallItemResource": "OpenAI.FileSearchToolCallItemResource", "azure.ai.projects.models.FolderDatasetVersion": "Azure.AI.Projects.FolderDatasetVersion", - "azure.ai.projects.models.InputData": "Azure.AI.Projects.InputData", - "azure.ai.projects.models.InputDataset": "Azure.AI.Projects.InputDataset", + "azure.ai.projects.models.FunctionTool": "OpenAI.FunctionTool", + "azure.ai.projects.models.FunctionToolCallItemParam": "OpenAI.FunctionToolCallItemParam", + "azure.ai.projects.models.FunctionToolCallItemResource": "OpenAI.FunctionToolCallItemResource", + "azure.ai.projects.models.FunctionToolCallOutputItemParam": "OpenAI.FunctionToolCallOutputItemParam", + "azure.ai.projects.models.FunctionToolCallOutputItemResource": "OpenAI.FunctionToolCallOutputItemResource", + "azure.ai.projects.models.HostedAgentDefinition": "Azure.AI.Projects.HostedAgentDefinition", + "azure.ai.projects.models.HourlyRecurrenceSchedule": "Azure.AI.Projects.HourlyRecurrenceSchedule", + "azure.ai.projects.models.HumanEvaluationRuleAction": "Azure.AI.Projects.HumanEvaluationRuleAction", + "azure.ai.projects.models.ImageBasedHostedAgentDefinition": "Azure.AI.Projects.ImageBasedHostedAgentDefinition", + "azure.ai.projects.models.ImageGenTool": "OpenAI.ImageGenTool", + "azure.ai.projects.models.ImageGenToolCallItemParam": "OpenAI.ImageGenToolCallItemParam", + "azure.ai.projects.models.ImageGenToolCallItemResource": "OpenAI.ImageGenToolCallItemResource", + "azure.ai.projects.models.ImageGenToolInputImageMask": "OpenAI.ImageGenTool.input_image_mask.anonymous", + "azure.ai.projects.models.Insight": "Azure.AI.Projects.Insight", + "azure.ai.projects.models.InsightCluster": "Azure.AI.Projects.InsightCluster", + "azure.ai.projects.models.InsightModelConfiguration": "Azure.AI.Projects.InsightModelConfiguration", + "azure.ai.projects.models.InsightScheduleTask": "Azure.AI.Projects.InsightScheduleTask", + "azure.ai.projects.models.InsightsMetadata": "Azure.AI.Projects.InsightsMetadata", + "azure.ai.projects.models.InsightSummary": "Azure.AI.Projects.InsightSummary", + "azure.ai.projects.models.WorkflowActionOutputItemResource": "Azure.AI.Projects.WorkflowActionOutputItemResource", + "azure.ai.projects.models.InvokeAzureAgentWorkflowActionOutputItemResource": "Azure.AI.Projects.InvokeAzureAgentWorkflowActionOutputItemResource", + "azure.ai.projects.models.ItemContent": "OpenAI.ItemContent", + "azure.ai.projects.models.ItemContentInputAudio": "OpenAI.ItemContentInputAudio", + "azure.ai.projects.models.ItemContentInputFile": "OpenAI.ItemContentInputFile", + "azure.ai.projects.models.ItemContentInputImage": "OpenAI.ItemContentInputImage", + "azure.ai.projects.models.ItemContentInputText": "OpenAI.ItemContentInputText", + "azure.ai.projects.models.ItemContentOutputAudio": "OpenAI.ItemContentOutputAudio", + "azure.ai.projects.models.ItemContentOutputText": "OpenAI.ItemContentOutputText", + "azure.ai.projects.models.ItemContentRefusal": "OpenAI.ItemContentRefusal", + "azure.ai.projects.models.ItemReferenceItemParam": "OpenAI.ItemReferenceItemParam", + "azure.ai.projects.models.LocalShellExecAction": "OpenAI.LocalShellExecAction", + "azure.ai.projects.models.LocalShellTool": "OpenAI.LocalShellTool", + "azure.ai.projects.models.LocalShellToolCallItemParam": "OpenAI.LocalShellToolCallItemParam", + "azure.ai.projects.models.LocalShellToolCallItemResource": "OpenAI.LocalShellToolCallItemResource", + "azure.ai.projects.models.LocalShellToolCallOutputItemParam": "OpenAI.LocalShellToolCallOutputItemParam", + "azure.ai.projects.models.LocalShellToolCallOutputItemResource": "OpenAI.LocalShellToolCallOutputItemResource", + "azure.ai.projects.models.LogProb": "OpenAI.LogProb", "azure.ai.projects.models.ManagedAzureAISearchIndex": "Azure.AI.Projects.ManagedAzureAISearchIndex", + "azure.ai.projects.models.MCPApprovalRequestItemParam": "OpenAI.MCPApprovalRequestItemParam", + "azure.ai.projects.models.MCPApprovalRequestItemResource": "OpenAI.MCPApprovalRequestItemResource", + "azure.ai.projects.models.MCPApprovalResponseItemParam": "OpenAI.MCPApprovalResponseItemParam", + "azure.ai.projects.models.MCPApprovalResponseItemResource": "OpenAI.MCPApprovalResponseItemResource", + "azure.ai.projects.models.MCPCallItemParam": "OpenAI.MCPCallItemParam", + "azure.ai.projects.models.MCPCallItemResource": "OpenAI.MCPCallItemResource", + "azure.ai.projects.models.MCPListToolsItemParam": "OpenAI.MCPListToolsItemParam", + "azure.ai.projects.models.MCPListToolsItemResource": "OpenAI.MCPListToolsItemResource", + "azure.ai.projects.models.MCPListToolsTool": "OpenAI.MCPListToolsTool", + "azure.ai.projects.models.MCPTool": "OpenAI.MCPTool", + "azure.ai.projects.models.MCPToolAllowedTools1": "OpenAI.MCPTool.allowed_tools.anonymous", + "azure.ai.projects.models.MCPToolRequireApproval1": "OpenAI.MCPTool.require_approval.anonymous", + "azure.ai.projects.models.MCPToolRequireApprovalAlways": "OpenAI.MCPTool.require_approval.always.anonymous", + "azure.ai.projects.models.MCPToolRequireApprovalNever": "OpenAI.MCPTool.require_approval.never.anonymous", + "azure.ai.projects.models.MemoryOperation": "Azure.AI.Projects.MemoryOperation", + "azure.ai.projects.models.MemorySearchItem": "Azure.AI.Projects.MemorySearchItem", + "azure.ai.projects.models.MemorySearchOptions": "Azure.AI.Projects.MemorySearchOptions", + "azure.ai.projects.models.MemorySearchTool": "Azure.AI.Projects.MemorySearchTool", + "azure.ai.projects.models.MemorySearchToolCallItemParam": "Azure.AI.Projects.MemorySearchToolCallItemParam", + "azure.ai.projects.models.MemorySearchToolCallItemResource": "Azure.AI.Projects.MemorySearchToolCallItemResource", + "azure.ai.projects.models.MemoryStoreDefinition": "Azure.AI.Projects.MemoryStoreDefinition", + "azure.ai.projects.models.MemoryStoreDefaultDefinition": "Azure.AI.Projects.MemoryStoreDefaultDefinition", + "azure.ai.projects.models.MemoryStoreDefaultOptions": "Azure.AI.Projects.MemoryStoreDefaultOptions", + "azure.ai.projects.models.MemoryStoreDeleteScopeResponse": "Azure.AI.Projects.MemoryStoreDeleteScopeResponse", + "azure.ai.projects.models.MemoryStoreObject": "Azure.AI.Projects.MemoryStoreObject", + "azure.ai.projects.models.MemoryStoreOperationUsage": "Azure.AI.Projects.MemoryStoreOperationUsage", + "azure.ai.projects.models.MemoryStoreOperationUsageInputTokensDetails": "Azure.AI.Projects.MemoryStoreOperationUsage.input_tokens_details.anonymous", + "azure.ai.projects.models.MemoryStoreOperationUsageOutputTokensDetails": "Azure.AI.Projects.MemoryStoreOperationUsage.output_tokens_details.anonymous", + "azure.ai.projects.models.MemoryStoreSearchResponse": "Azure.AI.Projects.MemoryStoreSearchResponse", + "azure.ai.projects.models.MemoryStoreUpdateResponse": "Azure.AI.Projects.MemoryStoreUpdateResponse", + "azure.ai.projects.models.MemoryStoreUpdateResult": "Azure.AI.Projects.MemoryStoreUpdateResult", + "azure.ai.projects.models.MicrosoftFabricAgentTool": "Azure.AI.Projects.MicrosoftFabricAgentTool", "azure.ai.projects.models.ModelDeployment": "Azure.AI.Projects.ModelDeployment", "azure.ai.projects.models.ModelDeploymentSku": "Azure.AI.Projects.Sku", - "azure.ai.projects.models.ModelResponseGenerationTarget": "Azure.AI.Projects.modelResponseGenerationTarget", + "azure.ai.projects.models.MonthlyRecurrenceSchedule": "Azure.AI.Projects.MonthlyRecurrenceSchedule", "azure.ai.projects.models.NoAuthenticationCredentials": "Azure.AI.Projects.NoAuthenticationCredentials", + "azure.ai.projects.models.OAuthConsentRequestItemResource": "Azure.AI.Projects.OAuthConsentRequestItemResource", + "azure.ai.projects.models.OneTimeTrigger": "Azure.AI.Projects.OneTimeTrigger", + "azure.ai.projects.models.OpenApiAgentTool": "Azure.AI.Projects.OpenApiAgentTool", + "azure.ai.projects.models.OpenApiAuthDetails": "Azure.AI.Projects.OpenApiAuthDetails", + "azure.ai.projects.models.OpenApiAnonymousAuthDetails": "Azure.AI.Projects.OpenApiAnonymousAuthDetails", + "azure.ai.projects.models.OpenApiFunctionDefinition": "Azure.AI.Projects.OpenApiFunctionDefinition", + "azure.ai.projects.models.OpenApiFunctionDefinitionFunction": "Azure.AI.Projects.OpenApiFunctionDefinition.function.anonymous", + "azure.ai.projects.models.OpenApiManagedAuthDetails": "Azure.AI.Projects.OpenApiManagedAuthDetails", + "azure.ai.projects.models.OpenApiManagedSecurityScheme": "Azure.AI.Projects.OpenApiManagedSecurityScheme", + "azure.ai.projects.models.OpenApiProjectConnectionAuthDetails": "Azure.AI.Projects.OpenApiProjectConnectionAuthDetails", + "azure.ai.projects.models.OpenApiProjectConnectionSecurityScheme": "Azure.AI.Projects.OpenApiProjectConnectionSecurityScheme", + "azure.ai.projects.models.PagedScheduleRun": "Azure.Core.Page", "azure.ai.projects.models.PendingUploadRequest": "Azure.AI.Projects.PendingUploadRequest", "azure.ai.projects.models.PendingUploadResponse": "Azure.AI.Projects.PendingUploadResponse", + "azure.ai.projects.models.Prompt": "OpenAI.Prompt", + "azure.ai.projects.models.PromptAgentDefinition": "Azure.AI.Projects.PromptAgentDefinition", + "azure.ai.projects.models.PromptAgentDefinitionText": "Azure.AI.Projects.PromptAgentDefinition.text.anonymous", + "azure.ai.projects.models.PromptBasedEvaluatorDefinition": "Azure.AI.Projects.PromptBasedEvaluatorDefinition", + "azure.ai.projects.models.ProtocolVersionRecord": "Azure.AI.Projects.ProtocolVersionRecord", + "azure.ai.projects.models.RaiConfig": "Azure.AI.Projects.RaiConfig", + "azure.ai.projects.models.RankingOptions": "OpenAI.RankingOptions", + "azure.ai.projects.models.Reasoning": "OpenAI.Reasoning", + "azure.ai.projects.models.ReasoningItemParam": "OpenAI.ReasoningItemParam", + "azure.ai.projects.models.ReasoningItemResource": "OpenAI.ReasoningItemResource", + "azure.ai.projects.models.ReasoningItemSummaryPart": "OpenAI.ReasoningItemSummaryPart", + "azure.ai.projects.models.ReasoningItemSummaryTextPart": "OpenAI.ReasoningItemSummaryTextPart", + "azure.ai.projects.models.RecurrenceTrigger": "Azure.AI.Projects.RecurrenceTrigger", "azure.ai.projects.models.RedTeam": "Azure.AI.Projects.RedTeam", + "azure.ai.projects.models.Response": "OpenAI.Response", + "azure.ai.projects.models.ResponseStreamEvent": "OpenAI.ResponseStreamEvent", + "azure.ai.projects.models.ResponseCodeInterpreterCallCodeDeltaEvent": "OpenAI.ResponseCodeInterpreterCallCodeDeltaEvent", + "azure.ai.projects.models.ResponseCodeInterpreterCallCodeDoneEvent": "OpenAI.ResponseCodeInterpreterCallCodeDoneEvent", + "azure.ai.projects.models.ResponseCodeInterpreterCallCompletedEvent": "OpenAI.ResponseCodeInterpreterCallCompletedEvent", + "azure.ai.projects.models.ResponseCodeInterpreterCallInProgressEvent": "OpenAI.ResponseCodeInterpreterCallInProgressEvent", + "azure.ai.projects.models.ResponseCodeInterpreterCallInterpretingEvent": "OpenAI.ResponseCodeInterpreterCallInterpretingEvent", + "azure.ai.projects.models.ResponseCompletedEvent": "OpenAI.ResponseCompletedEvent", + "azure.ai.projects.models.ResponseContentPartAddedEvent": "OpenAI.ResponseContentPartAddedEvent", + "azure.ai.projects.models.ResponseContentPartDoneEvent": "OpenAI.ResponseContentPartDoneEvent", + "azure.ai.projects.models.ResponseConversation1": "OpenAI.Response.conversation.anonymous", + "azure.ai.projects.models.ResponseCreatedEvent": "OpenAI.ResponseCreatedEvent", + "azure.ai.projects.models.ResponseError": "OpenAI.ResponseError", + "azure.ai.projects.models.ResponseErrorEvent": "OpenAI.ResponseErrorEvent", + "azure.ai.projects.models.ResponseFailedEvent": "OpenAI.ResponseFailedEvent", + "azure.ai.projects.models.ResponseFileSearchCallCompletedEvent": "OpenAI.ResponseFileSearchCallCompletedEvent", + "azure.ai.projects.models.ResponseFileSearchCallInProgressEvent": "OpenAI.ResponseFileSearchCallInProgressEvent", + "azure.ai.projects.models.ResponseFileSearchCallSearchingEvent": "OpenAI.ResponseFileSearchCallSearchingEvent", + "azure.ai.projects.models.ResponseFormatJsonSchemaSchema": "OpenAI.ResponseFormatJsonSchemaSchema", + "azure.ai.projects.models.ResponseFunctionCallArgumentsDeltaEvent": "OpenAI.ResponseFunctionCallArgumentsDeltaEvent", + "azure.ai.projects.models.ResponseFunctionCallArgumentsDoneEvent": "OpenAI.ResponseFunctionCallArgumentsDoneEvent", + "azure.ai.projects.models.ResponseImageGenCallCompletedEvent": "OpenAI.ResponseImageGenCallCompletedEvent", + "azure.ai.projects.models.ResponseImageGenCallGeneratingEvent": "OpenAI.ResponseImageGenCallGeneratingEvent", + "azure.ai.projects.models.ResponseImageGenCallInProgressEvent": "OpenAI.ResponseImageGenCallInProgressEvent", + "azure.ai.projects.models.ResponseImageGenCallPartialImageEvent": "OpenAI.ResponseImageGenCallPartialImageEvent", + "azure.ai.projects.models.ResponseIncompleteDetails1": "OpenAI.Response.incomplete_details.anonymous", + "azure.ai.projects.models.ResponseIncompleteEvent": "OpenAI.ResponseIncompleteEvent", + "azure.ai.projects.models.ResponseInProgressEvent": "OpenAI.ResponseInProgressEvent", + "azure.ai.projects.models.ResponseMCPCallArgumentsDeltaEvent": "OpenAI.ResponseMCPCallArgumentsDeltaEvent", + "azure.ai.projects.models.ResponseMCPCallArgumentsDoneEvent": "OpenAI.ResponseMCPCallArgumentsDoneEvent", + "azure.ai.projects.models.ResponseMCPCallCompletedEvent": "OpenAI.ResponseMCPCallCompletedEvent", + "azure.ai.projects.models.ResponseMCPCallFailedEvent": "OpenAI.ResponseMCPCallFailedEvent", + "azure.ai.projects.models.ResponseMCPCallInProgressEvent": "OpenAI.ResponseMCPCallInProgressEvent", + "azure.ai.projects.models.ResponseMCPListToolsCompletedEvent": "OpenAI.ResponseMCPListToolsCompletedEvent", + "azure.ai.projects.models.ResponseMCPListToolsFailedEvent": "OpenAI.ResponseMCPListToolsFailedEvent", + "azure.ai.projects.models.ResponseMCPListToolsInProgressEvent": "OpenAI.ResponseMCPListToolsInProgressEvent", + "azure.ai.projects.models.ResponseOutputItemAddedEvent": "OpenAI.ResponseOutputItemAddedEvent", + "azure.ai.projects.models.ResponseOutputItemDoneEvent": "OpenAI.ResponseOutputItemDoneEvent", + "azure.ai.projects.models.ResponsePromptVariables": "OpenAI.ResponsePromptVariables", + "azure.ai.projects.models.ResponseQueuedEvent": "OpenAI.ResponseQueuedEvent", + "azure.ai.projects.models.ResponseReasoningDeltaEvent": "OpenAI.ResponseReasoningDeltaEvent", + "azure.ai.projects.models.ResponseReasoningDoneEvent": "OpenAI.ResponseReasoningDoneEvent", + "azure.ai.projects.models.ResponseReasoningSummaryDeltaEvent": "OpenAI.ResponseReasoningSummaryDeltaEvent", + "azure.ai.projects.models.ResponseReasoningSummaryDoneEvent": "OpenAI.ResponseReasoningSummaryDoneEvent", + "azure.ai.projects.models.ResponseReasoningSummaryPartAddedEvent": "OpenAI.ResponseReasoningSummaryPartAddedEvent", + "azure.ai.projects.models.ResponseReasoningSummaryPartDoneEvent": "OpenAI.ResponseReasoningSummaryPartDoneEvent", + "azure.ai.projects.models.ResponseReasoningSummaryTextDeltaEvent": "OpenAI.ResponseReasoningSummaryTextDeltaEvent", + "azure.ai.projects.models.ResponseReasoningSummaryTextDoneEvent": "OpenAI.ResponseReasoningSummaryTextDoneEvent", + "azure.ai.projects.models.ResponseRefusalDeltaEvent": "OpenAI.ResponseRefusalDeltaEvent", + "azure.ai.projects.models.ResponseRefusalDoneEvent": "OpenAI.ResponseRefusalDoneEvent", + "azure.ai.projects.models.ResponsesMessageItemParam": "OpenAI.ResponsesMessageItemParam", + "azure.ai.projects.models.ResponsesAssistantMessageItemParam": "OpenAI.ResponsesAssistantMessageItemParam", + "azure.ai.projects.models.ResponsesMessageItemResource": "OpenAI.ResponsesMessageItemResource", + "azure.ai.projects.models.ResponsesAssistantMessageItemResource": "OpenAI.ResponsesAssistantMessageItemResource", + "azure.ai.projects.models.ResponsesDeveloperMessageItemParam": "OpenAI.ResponsesDeveloperMessageItemParam", + "azure.ai.projects.models.ResponsesDeveloperMessageItemResource": "OpenAI.ResponsesDeveloperMessageItemResource", + "azure.ai.projects.models.ResponsesSystemMessageItemParam": "OpenAI.ResponsesSystemMessageItemParam", + "azure.ai.projects.models.ResponsesSystemMessageItemResource": "OpenAI.ResponsesSystemMessageItemResource", + "azure.ai.projects.models.ResponsesUserMessageItemParam": "OpenAI.ResponsesUserMessageItemParam", + "azure.ai.projects.models.ResponsesUserMessageItemResource": "OpenAI.ResponsesUserMessageItemResource", + "azure.ai.projects.models.ResponseText": "OpenAI.Response.text.anonymous", + "azure.ai.projects.models.ResponseTextDeltaEvent": "OpenAI.ResponseTextDeltaEvent", + "azure.ai.projects.models.ResponseTextDoneEvent": "OpenAI.ResponseTextDoneEvent", + "azure.ai.projects.models.ResponseTextFormatConfiguration": "OpenAI.ResponseTextFormatConfiguration", + "azure.ai.projects.models.ResponseTextFormatConfigurationJsonObject": "OpenAI.ResponseTextFormatConfigurationJsonObject", + "azure.ai.projects.models.ResponseTextFormatConfigurationJsonSchema": "OpenAI.ResponseTextFormatConfigurationJsonSchema", + "azure.ai.projects.models.ResponseTextFormatConfigurationText": "OpenAI.ResponseTextFormatConfigurationText", + "azure.ai.projects.models.ResponseUsage": "OpenAI.ResponseUsage", + "azure.ai.projects.models.ResponseWebSearchCallCompletedEvent": "OpenAI.ResponseWebSearchCallCompletedEvent", + "azure.ai.projects.models.ResponseWebSearchCallInProgressEvent": "OpenAI.ResponseWebSearchCallInProgressEvent", + "azure.ai.projects.models.ResponseWebSearchCallSearchingEvent": "OpenAI.ResponseWebSearchCallSearchingEvent", "azure.ai.projects.models.SASCredentials": "Azure.AI.Projects.SASCredentials", - "azure.ai.projects.models.SystemMessage": "Azure.AI.Projects.SystemMessage", - "azure.ai.projects.models.UserMessage": "Azure.AI.Projects.UserMessage", + "azure.ai.projects.models.Schedule": "Azure.AI.Projects.Schedule", + "azure.ai.projects.models.ScheduleRun": "Azure.AI.Projects.ScheduleRun", + "azure.ai.projects.models.SharepointAgentTool": "Azure.AI.Projects.SharepointAgentTool", + "azure.ai.projects.models.SharepointGroundingToolParameters": "Azure.AI.Projects.SharepointGroundingToolParameters", + "azure.ai.projects.models.StructuredInputDefinition": "Azure.AI.Projects.StructuredInputDefinition", + "azure.ai.projects.models.StructuredOutputDefinition": "Azure.AI.Projects.StructuredOutputDefinition", + "azure.ai.projects.models.StructuredOutputsItemResource": "Azure.AI.Projects.StructuredOutputsItemResource", + "azure.ai.projects.models.TaxonomyCategory": "Azure.AI.Projects.TaxonomyCategory", + "azure.ai.projects.models.TaxonomySubCategory": "Azure.AI.Projects.TaxonomySubCategory", + "azure.ai.projects.models.ToolArgumentBinding": "Azure.AI.Projects.ToolArgumentBinding", + "azure.ai.projects.models.ToolChoiceObject": "OpenAI.ToolChoiceObject", + "azure.ai.projects.models.ToolChoiceObjectCodeInterpreter": "OpenAI.ToolChoiceObjectCodeInterpreter", + "azure.ai.projects.models.ToolChoiceObjectComputer": "OpenAI.ToolChoiceObjectComputer", + "azure.ai.projects.models.ToolChoiceObjectFileSearch": "OpenAI.ToolChoiceObjectFileSearch", + "azure.ai.projects.models.ToolChoiceObjectFunction": "OpenAI.ToolChoiceObjectFunction", + "azure.ai.projects.models.ToolChoiceObjectImageGen": "OpenAI.ToolChoiceObjectImageGen", + "azure.ai.projects.models.ToolChoiceObjectMCP": "OpenAI.ToolChoiceObjectMCP", + "azure.ai.projects.models.ToolChoiceObjectWebSearch": "OpenAI.ToolChoiceObjectWebSearch", + "azure.ai.projects.models.ToolDescription": "Azure.AI.Projects.ToolDescription", + "azure.ai.projects.models.ToolProjectConnection": "Azure.AI.Projects.ToolProjectConnection", + "azure.ai.projects.models.ToolProjectConnectionList": "Azure.AI.Projects.ToolProjectConnectionList", + "azure.ai.projects.models.TopLogProb": "OpenAI.TopLogProb", + "azure.ai.projects.models.UserProfileMemoryItem": "Azure.AI.Projects.UserProfileMemoryItem", + "azure.ai.projects.models.VectorStoreFileAttributes": "OpenAI.VectorStoreFileAttributes", + "azure.ai.projects.models.WebSearchAction": "OpenAI.WebSearchAction", + "azure.ai.projects.models.WebSearchActionFind": "OpenAI.WebSearchActionFind", + "azure.ai.projects.models.WebSearchActionOpenPage": "OpenAI.WebSearchActionOpenPage", + "azure.ai.projects.models.WebSearchActionSearch": "OpenAI.WebSearchActionSearch", + "azure.ai.projects.models.WebSearchPreviewTool": "OpenAI.WebSearchPreviewTool", + "azure.ai.projects.models.WebSearchToolCallItemParam": "OpenAI.WebSearchToolCallItemParam", + "azure.ai.projects.models.WebSearchToolCallItemResource": "OpenAI.WebSearchToolCallItemResource", + "azure.ai.projects.models.WeeklyRecurrenceSchedule": "Azure.AI.Projects.WeeklyRecurrenceSchedule", + "azure.ai.projects.models.WorkflowDefinition": "Azure.AI.Projects.WorkflowDefinition", + "azure.ai.projects.models.AgentKind": "Azure.AI.Projects.AgentKind", + "azure.ai.projects.models.AgentProtocol": "Azure.AI.Projects.AgentProtocol", + "azure.ai.projects.models.ToolType": "OpenAI.ToolType", + "azure.ai.projects.models.AzureAISearchQueryType": "Azure.AI.Projects.AzureAISearchQueryType", + "azure.ai.projects.models.OpenApiAuthType": "Azure.AI.Projects.OpenApiAuthType", + "azure.ai.projects.models.LocationType": "OpenAI.LocationType", + "azure.ai.projects.models.ReasoningEffort": "OpenAI.ReasoningEffort", + "azure.ai.projects.models.ResponseTextFormatConfigurationType": "OpenAI.ResponseTextFormatConfigurationType", + "azure.ai.projects.models.AgentContainerOperationStatus": "Azure.AI.Projects.AgentContainerOperationStatus", + "azure.ai.projects.models.AgentContainerStatus": "Azure.AI.Projects.AgentContainerStatus", + "azure.ai.projects.models.MemoryStoreKind": "Azure.AI.Projects.MemoryStoreKind", + "azure.ai.projects.models.MemoryItemKind": "Azure.AI.Projects.MemoryItemKind", + "azure.ai.projects.models.ItemType": "OpenAI.ItemType", + "azure.ai.projects.models.CodeInterpreterOutputType": "OpenAI.CodeInterpreterOutputType", + "azure.ai.projects.models.ComputerActionType": "OpenAI.ComputerActionType", + "azure.ai.projects.models.ComputerToolCallOutputItemOutputType": "OpenAI.ComputerToolCallOutputItemOutputType", + "azure.ai.projects.models.ResponsesMessageRole": "OpenAI.ResponsesMessageRole", + "azure.ai.projects.models.ItemContentType": "OpenAI.ItemContentType", + "azure.ai.projects.models.AnnotationType": "OpenAI.AnnotationType", + "azure.ai.projects.models.ReasoningItemSummaryPartType": "OpenAI.ReasoningItemSummaryPartType", + "azure.ai.projects.models.WebSearchActionType": "OpenAI.WebSearchActionType", + "azure.ai.projects.models.MemoryOperationKind": "Azure.AI.Projects.MemoryOperationKind", + "azure.ai.projects.models.MemoryStoreUpdateStatus": "Azure.AI.Projects.MemoryStoreUpdateStatus", "azure.ai.projects.models.ConnectionType": "Azure.AI.Projects.ConnectionType", "azure.ai.projects.models.CredentialType": "Azure.AI.Projects.CredentialType", - "azure.ai.projects.models.EvaluationTargetType": "Azure.AI.Projects.EvaluationTargetType", "azure.ai.projects.models.DatasetType": "Azure.AI.Projects.DatasetType", "azure.ai.projects.models.PendingUploadType": "Azure.AI.Projects.PendingUploadType", "azure.ai.projects.models.IndexType": "Azure.AI.Projects.IndexType", "azure.ai.projects.models.DeploymentType": "Azure.AI.Projects.DeploymentType", "azure.ai.projects.models.AttackStrategy": "Azure.AI.Projects.AttackStrategy", "azure.ai.projects.models.RiskCategory": "Azure.AI.Projects.RiskCategory", + "azure.ai.projects.models.EvaluationRuleActionType": "Azure.AI.Projects.EvaluationRuleActionType", + "azure.ai.projects.models.EvaluationRuleEventType": "Azure.AI.Projects.EvaluationRuleEventType", + "azure.ai.projects.models.EvaluationTaxonomyInputType": "Azure.AI.Projects.EvaluationTaxonomyInputType", + "azure.ai.projects.models.EvaluatorType": "Azure.AI.Projects.EvaluatorType", + "azure.ai.projects.models.EvaluatorCategory": "Azure.AI.Projects.EvaluatorCategory", + "azure.ai.projects.models.EvaluatorDefinitionType": "Azure.AI.Projects.EvaluatorDefinitionType", + "azure.ai.projects.models.EvaluatorMetricType": "Azure.AI.Projects.EvaluatorMetricType", + "azure.ai.projects.models.EvaluatorMetricDirection": "Azure.AI.Projects.EvaluatorMetricDirection", + "azure.ai.projects.models.OperationState": "Azure.Core.Foundations.OperationState", + "azure.ai.projects.models.InsightType": "Azure.AI.Projects.InsightType", + "azure.ai.projects.models.SampleType": "Azure.AI.Projects.SampleType", + "azure.ai.projects.models.TreatmentEffectType": "Azure.AI.Projects.TreatmentEffectType", + "azure.ai.projects.models.ScheduleProvisioningStatus": "Azure.AI.Projects.ScheduleProvisioningStatus", + "azure.ai.projects.models.TriggerType": "Azure.AI.Projects.TriggerType", + "azure.ai.projects.models.RecurrenceType": "Azure.AI.Projects.RecurrenceType", + "azure.ai.projects.models.DayOfWeek": "Azure.AI.Projects.DayOfWeek", + "azure.ai.projects.models.ScheduleTaskType": "Azure.AI.Projects.ScheduleTaskType", + "azure.ai.projects.models.ServiceTier": "OpenAI.ServiceTier", + "azure.ai.projects.models.ToolChoiceOptions": "OpenAI.ToolChoiceOptions", + "azure.ai.projects.models.ToolChoiceObjectType": "OpenAI.ToolChoiceObjectType", + "azure.ai.projects.models.ResponseErrorCode": "OpenAI.ResponseErrorCode", + "azure.ai.projects.models.ResponseStreamEventType": "OpenAI.ResponseStreamEventType", + "azure.ai.projects.operations.AgentsOperations.retrieve": "Azure.AI.Projects.Agents.getAgent", + "azure.ai.projects.aio.operations.AgentsOperations.retrieve": "Azure.AI.Projects.Agents.getAgent", + "azure.ai.projects.operations.AgentsOperations.create": "Azure.AI.Projects.Agents.createAgent", + "azure.ai.projects.aio.operations.AgentsOperations.create": "Azure.AI.Projects.Agents.createAgent", + "azure.ai.projects.operations.AgentsOperations.update": "Azure.AI.Projects.Agents.updateAgent", + "azure.ai.projects.aio.operations.AgentsOperations.update": "Azure.AI.Projects.Agents.updateAgent", + "azure.ai.projects.operations.AgentsOperations.create_agent_from_manifest": "Azure.AI.Projects.Agents.createAgentFromManifest", + "azure.ai.projects.aio.operations.AgentsOperations.create_agent_from_manifest": "Azure.AI.Projects.Agents.createAgentFromManifest", + "azure.ai.projects.operations.AgentsOperations.update_agent_from_manifest": "Azure.AI.Projects.Agents.updateAgentFromManifest", + "azure.ai.projects.aio.operations.AgentsOperations.update_agent_from_manifest": "Azure.AI.Projects.Agents.updateAgentFromManifest", + "azure.ai.projects.operations.AgentsOperations.delete": "Azure.AI.Projects.Agents.deleteAgent", + "azure.ai.projects.aio.operations.AgentsOperations.delete": "Azure.AI.Projects.Agents.deleteAgent", + "azure.ai.projects.operations.AgentsOperations.list": "Azure.AI.Projects.Agents.listAgents", + "azure.ai.projects.aio.operations.AgentsOperations.list": "Azure.AI.Projects.Agents.listAgents", + "azure.ai.projects.operations.AgentsOperations.create_version": "Azure.AI.Projects.Agents.createAgentVersion", + "azure.ai.projects.aio.operations.AgentsOperations.create_version": "Azure.AI.Projects.Agents.createAgentVersion", + "azure.ai.projects.operations.AgentsOperations.create_agent_version_from_manifest": "Azure.AI.Projects.Agents.createAgentVersionFromManifest", + "azure.ai.projects.aio.operations.AgentsOperations.create_agent_version_from_manifest": "Azure.AI.Projects.Agents.createAgentVersionFromManifest", + "azure.ai.projects.operations.AgentsOperations.retrieve_version": "Azure.AI.Projects.Agents.getAgentVersion", + "azure.ai.projects.aio.operations.AgentsOperations.retrieve_version": "Azure.AI.Projects.Agents.getAgentVersion", + "azure.ai.projects.operations.AgentsOperations.delete_version": "Azure.AI.Projects.Agents.deleteAgentVersion", + "azure.ai.projects.aio.operations.AgentsOperations.delete_version": "Azure.AI.Projects.Agents.deleteAgentVersion", + "azure.ai.projects.operations.AgentsOperations.list_versions": "Azure.AI.Projects.Agents.listAgentVersions", + "azure.ai.projects.aio.operations.AgentsOperations.list_versions": "Azure.AI.Projects.Agents.listAgentVersions", + "azure.ai.projects.operations.AgentsOperations.start_container": "Azure.AI.Projects.Agents.startAgentContainer", + "azure.ai.projects.aio.operations.AgentsOperations.start_container": "Azure.AI.Projects.Agents.startAgentContainer", + "azure.ai.projects.operations.AgentsOperations.update_container": "Azure.AI.Projects.Agents.updateAgentContainer", + "azure.ai.projects.aio.operations.AgentsOperations.update_container": "Azure.AI.Projects.Agents.updateAgentContainer", + "azure.ai.projects.operations.AgentsOperations.stop_container": "Azure.AI.Projects.Agents.stopAgentContainer", + "azure.ai.projects.aio.operations.AgentsOperations.stop_container": "Azure.AI.Projects.Agents.stopAgentContainer", + "azure.ai.projects.operations.AgentsOperations.delete_container": "Azure.AI.Projects.Agents.deleteAgentContainer", + "azure.ai.projects.aio.operations.AgentsOperations.delete_container": "Azure.AI.Projects.Agents.deleteAgentContainer", + "azure.ai.projects.operations.AgentsOperations.retrieve_container": "Azure.AI.Projects.Agents.getAgentContainer", + "azure.ai.projects.aio.operations.AgentsOperations.retrieve_container": "Azure.AI.Projects.Agents.getAgentContainer", + "azure.ai.projects.operations.AgentsOperations.retrieve_container_operation": "Azure.AI.Projects.Agents.getAgentContainerOperation", + "azure.ai.projects.aio.operations.AgentsOperations.retrieve_container_operation": "Azure.AI.Projects.Agents.getAgentContainerOperation", + "azure.ai.projects.operations.AgentsOperations.list_container_operations": "Azure.AI.Projects.Agents.listAgentContainerOperations", + "azure.ai.projects.aio.operations.AgentsOperations.list_container_operations": "Azure.AI.Projects.Agents.listAgentContainerOperations", + "azure.ai.projects.operations.AgentsOperations.list_version_container_operations": "Azure.AI.Projects.Agents.listAgentVersionContainerOperations", + "azure.ai.projects.aio.operations.AgentsOperations.list_version_container_operations": "Azure.AI.Projects.Agents.listAgentVersionContainerOperations", + "azure.ai.projects.operations.MemoryStoresOperations.create_memory_store": "Azure.AI.Projects.MemoryStores.createMemoryStore", + "azure.ai.projects.aio.operations.MemoryStoresOperations.create_memory_store": "Azure.AI.Projects.MemoryStores.createMemoryStore", + "azure.ai.projects.operations.MemoryStoresOperations.update_memory_store": "Azure.AI.Projects.MemoryStores.updateMemoryStore", + "azure.ai.projects.aio.operations.MemoryStoresOperations.update_memory_store": "Azure.AI.Projects.MemoryStores.updateMemoryStore", + "azure.ai.projects.operations.MemoryStoresOperations.get_memory_store": "Azure.AI.Projects.MemoryStores.getMemoryStore", + "azure.ai.projects.aio.operations.MemoryStoresOperations.get_memory_store": "Azure.AI.Projects.MemoryStores.getMemoryStore", + "azure.ai.projects.operations.MemoryStoresOperations.list_memory_stores": "Azure.AI.Projects.MemoryStores.listMemoryStores", + "azure.ai.projects.aio.operations.MemoryStoresOperations.list_memory_stores": "Azure.AI.Projects.MemoryStores.listMemoryStores", + "azure.ai.projects.operations.MemoryStoresOperations.delete_memory_store": "Azure.AI.Projects.MemoryStores.deleteMemoryStore", + "azure.ai.projects.aio.operations.MemoryStoresOperations.delete_memory_store": "Azure.AI.Projects.MemoryStores.deleteMemoryStore", + "azure.ai.projects.operations.MemoryStoresOperations.search_memories": "Azure.AI.Projects.MemoryStores.searchMemories", + "azure.ai.projects.aio.operations.MemoryStoresOperations.search_memories": "Azure.AI.Projects.MemoryStores.searchMemories", + "azure.ai.projects.operations.MemoryStoresOperations.begin_update_memories": "Azure.AI.Projects.MemoryStores.updateMemories", + "azure.ai.projects.aio.operations.MemoryStoresOperations.begin_update_memories": "Azure.AI.Projects.MemoryStores.updateMemories", + "azure.ai.projects.operations.MemoryStoresOperations.get_update_result": "Azure.AI.Projects.MemoryStores.getUpdateResult", + "azure.ai.projects.aio.operations.MemoryStoresOperations.get_update_result": "Azure.AI.Projects.MemoryStores.getUpdateResult", + "azure.ai.projects.operations.MemoryStoresOperations.delete_scope": "Azure.AI.Projects.MemoryStores.deleteScope", + "azure.ai.projects.aio.operations.MemoryStoresOperations.delete_scope": "Azure.AI.Projects.MemoryStores.deleteScope", "azure.ai.projects.operations.ConnectionsOperations.list": "Azure.AI.Projects.Connections.list", "azure.ai.projects.aio.operations.ConnectionsOperations.list": "Azure.AI.Projects.Connections.list", - "azure.ai.projects.operations.EvaluationsOperations.get": "Azure.AI.Projects.Evaluations.get", - "azure.ai.projects.aio.operations.EvaluationsOperations.get": "Azure.AI.Projects.Evaluations.get", - "azure.ai.projects.operations.EvaluationsOperations.list": "Azure.AI.Projects.Evaluations.list", - "azure.ai.projects.aio.operations.EvaluationsOperations.list": "Azure.AI.Projects.Evaluations.list", - "azure.ai.projects.operations.EvaluationsOperations.create": "Azure.AI.Projects.Evaluations.create", - "azure.ai.projects.aio.operations.EvaluationsOperations.create": "Azure.AI.Projects.Evaluations.create", - "azure.ai.projects.operations.EvaluationsOperations.create_agent_evaluation": "Azure.AI.Projects.Evaluations.createAgentEvaluation", - "azure.ai.projects.aio.operations.EvaluationsOperations.create_agent_evaluation": "Azure.AI.Projects.Evaluations.createAgentEvaluation", - "azure.ai.projects.operations.EvaluationsOperations.cancel": "Azure.AI.Projects.Evaluations.cancel", - "azure.ai.projects.aio.operations.EvaluationsOperations.cancel": "Azure.AI.Projects.Evaluations.cancel", - "azure.ai.projects.operations.EvaluationsOperations.delete": "Azure.AI.Projects.Evaluations.delete", - "azure.ai.projects.aio.operations.EvaluationsOperations.delete": "Azure.AI.Projects.Evaluations.delete", "azure.ai.projects.operations.DatasetsOperations.list_versions": "Azure.AI.Projects.Datasets.listVersions", "azure.ai.projects.aio.operations.DatasetsOperations.list_versions": "Azure.AI.Projects.Datasets.listVersions", "azure.ai.projects.operations.DatasetsOperations.list": "Azure.AI.Projects.Datasets.listLatest", @@ -100,6 +490,54 @@ "azure.ai.projects.operations.RedTeamsOperations.list": "Azure.AI.Projects.RedTeams.list", "azure.ai.projects.aio.operations.RedTeamsOperations.list": "Azure.AI.Projects.RedTeams.list", "azure.ai.projects.operations.RedTeamsOperations.create": "Azure.AI.Projects.RedTeams.create", - "azure.ai.projects.aio.operations.RedTeamsOperations.create": "Azure.AI.Projects.RedTeams.create" + "azure.ai.projects.aio.operations.RedTeamsOperations.create": "Azure.AI.Projects.RedTeams.create", + "azure.ai.projects.operations.EvaluationRulesOperations.get": "Azure.AI.Projects.EvaluationRules.get", + "azure.ai.projects.aio.operations.EvaluationRulesOperations.get": "Azure.AI.Projects.EvaluationRules.get", + "azure.ai.projects.operations.EvaluationRulesOperations.delete": "Azure.AI.Projects.EvaluationRules.delete", + "azure.ai.projects.aio.operations.EvaluationRulesOperations.delete": "Azure.AI.Projects.EvaluationRules.delete", + "azure.ai.projects.operations.EvaluationRulesOperations.create_or_update": "Azure.AI.Projects.EvaluationRules.createOrUpdate", + "azure.ai.projects.aio.operations.EvaluationRulesOperations.create_or_update": "Azure.AI.Projects.EvaluationRules.createOrUpdate", + "azure.ai.projects.operations.EvaluationRulesOperations.list": "Azure.AI.Projects.EvaluationRules.list", + "azure.ai.projects.aio.operations.EvaluationRulesOperations.list": "Azure.AI.Projects.EvaluationRules.list", + "azure.ai.projects.operations.EvaluationTaxonomiesOperations.get": "Azure.AI.Projects.EvaluationTaxonomies.get", + "azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations.get": "Azure.AI.Projects.EvaluationTaxonomies.get", + "azure.ai.projects.operations.EvaluationTaxonomiesOperations.list": "Azure.AI.Projects.EvaluationTaxonomies.list", + "azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations.list": "Azure.AI.Projects.EvaluationTaxonomies.list", + "azure.ai.projects.operations.EvaluationTaxonomiesOperations.delete": "Azure.AI.Projects.EvaluationTaxonomies.delete", + "azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations.delete": "Azure.AI.Projects.EvaluationTaxonomies.delete", + "azure.ai.projects.operations.EvaluationTaxonomiesOperations.create": "Azure.AI.Projects.EvaluationTaxonomies.create", + "azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations.create": "Azure.AI.Projects.EvaluationTaxonomies.create", + "azure.ai.projects.operations.EvaluationTaxonomiesOperations.update": "Azure.AI.Projects.EvaluationTaxonomies.update", + "azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations.update": "Azure.AI.Projects.EvaluationTaxonomies.update", + "azure.ai.projects.operations.EvaluatorsOperations.list_versions": "Azure.AI.Projects.Evaluators.listVersions", + "azure.ai.projects.aio.operations.EvaluatorsOperations.list_versions": "Azure.AI.Projects.Evaluators.listVersions", + "azure.ai.projects.operations.EvaluatorsOperations.list_latest_versions": "Azure.AI.Projects.Evaluators.listLatestVersions", + "azure.ai.projects.aio.operations.EvaluatorsOperations.list_latest_versions": "Azure.AI.Projects.Evaluators.listLatestVersions", + "azure.ai.projects.operations.EvaluatorsOperations.get_version": "Azure.AI.Projects.Evaluators.getVersion", + "azure.ai.projects.aio.operations.EvaluatorsOperations.get_version": "Azure.AI.Projects.Evaluators.getVersion", + "azure.ai.projects.operations.EvaluatorsOperations.delete_version": "Azure.AI.Projects.Evaluators.deleteVersion", + "azure.ai.projects.aio.operations.EvaluatorsOperations.delete_version": "Azure.AI.Projects.Evaluators.deleteVersion", + "azure.ai.projects.operations.EvaluatorsOperations.create_version": "Azure.AI.Projects.Evaluators.createVersion", + "azure.ai.projects.aio.operations.EvaluatorsOperations.create_version": "Azure.AI.Projects.Evaluators.createVersion", + "azure.ai.projects.operations.EvaluatorsOperations.update_version": "Azure.AI.Projects.Evaluators.updateVersion", + "azure.ai.projects.aio.operations.EvaluatorsOperations.update_version": "Azure.AI.Projects.Evaluators.updateVersion", + "azure.ai.projects.operations.InsightsOperations.generate": "Azure.AI.Projects.Insights.generate", + "azure.ai.projects.aio.operations.InsightsOperations.generate": "Azure.AI.Projects.Insights.generate", + "azure.ai.projects.operations.InsightsOperations.get": "Azure.AI.Projects.Insights.get", + "azure.ai.projects.aio.operations.InsightsOperations.get": "Azure.AI.Projects.Insights.get", + "azure.ai.projects.operations.InsightsOperations.list": "Azure.AI.Projects.Insights.list", + "azure.ai.projects.aio.operations.InsightsOperations.list": "Azure.AI.Projects.Insights.list", + "azure.ai.projects.operations.SchedulesOperations.delete": "Azure.AI.Projects.Schedules.delete", + "azure.ai.projects.aio.operations.SchedulesOperations.delete": "Azure.AI.Projects.Schedules.delete", + "azure.ai.projects.operations.SchedulesOperations.get": "Azure.AI.Projects.Schedules.get", + "azure.ai.projects.aio.operations.SchedulesOperations.get": "Azure.AI.Projects.Schedules.get", + "azure.ai.projects.operations.SchedulesOperations.list": "Azure.AI.Projects.Schedules.list", + "azure.ai.projects.aio.operations.SchedulesOperations.list": "Azure.AI.Projects.Schedules.list", + "azure.ai.projects.operations.SchedulesOperations.create_or_update": "Azure.AI.Projects.Schedules.createOrUpdate", + "azure.ai.projects.aio.operations.SchedulesOperations.create_or_update": "Azure.AI.Projects.Schedules.createOrUpdate", + "azure.ai.projects.operations.SchedulesOperations.get_run": "Azure.AI.Projects.Schedules.getRun", + "azure.ai.projects.aio.operations.SchedulesOperations.get_run": "Azure.AI.Projects.Schedules.getRun", + "azure.ai.projects.operations.SchedulesOperations.list_runs": "Azure.AI.Projects.Schedules.listRuns", + "azure.ai.projects.aio.operations.SchedulesOperations.list_runs": "Azure.AI.Projects.Schedules.listRuns" } } \ No newline at end of file diff --git a/sdk/ai/azure-ai-projects/assets.json b/sdk/ai/azure-ai-projects/assets.json index 9d6f84d6cd9f..8e63694942eb 100644 --- a/sdk/ai/azure-ai-projects/assets.json +++ b/sdk/ai/azure-ai-projects/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "python", "TagPrefix": "python/ai/azure-ai-projects", - "Tag": "python/ai/azure-ai-projects_89765454c9" + "Tag": "python/ai/azure-ai-projects_d6accbcde2" } diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_client.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_client.py index 01defbc76b40..28b6c1cbf12b 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_client.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_client.py @@ -17,25 +17,33 @@ from ._configuration import AIProjectClientConfiguration from ._utils.serialization import Deserializer, Serializer from .operations import ( + AgentsOperations, ConnectionsOperations, DatasetsOperations, DeploymentsOperations, - EvaluationsOperations, + EvaluationRulesOperations, + EvaluationTaxonomiesOperations, + EvaluatorsOperations, IndexesOperations, + InsightsOperations, + MemoryStoresOperations, RedTeamsOperations, + SchedulesOperations, ) if TYPE_CHECKING: from azure.core.credentials import TokenCredential -class AIProjectClient: +class AIProjectClient: # pylint: disable=too-many-instance-attributes """AIProjectClient. + :ivar agents: AgentsOperations operations + :vartype agents: azure.ai.projects.operations.AgentsOperations + :ivar memory_stores: MemoryStoresOperations operations + :vartype memory_stores: azure.ai.projects.operations.MemoryStoresOperations :ivar connections: ConnectionsOperations operations :vartype connections: azure.ai.projects.operations.ConnectionsOperations - :ivar evaluations: EvaluationsOperations operations - :vartype evaluations: azure.ai.projects.operations.EvaluationsOperations :ivar datasets: DatasetsOperations operations :vartype datasets: azure.ai.projects.operations.DatasetsOperations :ivar indexes: IndexesOperations operations @@ -44,22 +52,30 @@ class AIProjectClient: :vartype deployments: azure.ai.projects.operations.DeploymentsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.operations.RedTeamsOperations - :param endpoint: Project endpoint. In the form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project - `_" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name - `_" - if you want to explicitly - specify the Foundry Project name. Required. + :ivar evaluation_rules: EvaluationRulesOperations operations + :vartype evaluation_rules: azure.ai.projects.operations.EvaluationRulesOperations + :ivar evaluation_taxonomies: EvaluationTaxonomiesOperations operations + :vartype evaluation_taxonomies: azure.ai.projects.operations.EvaluationTaxonomiesOperations + :ivar evaluators: EvaluatorsOperations operations + :vartype evaluators: azure.ai.projects.operations.EvaluatorsOperations + :ivar insights: InsightsOperations operations + :vartype insights: azure.ai.projects.operations.InsightsOperations + :ivar schedules: SchedulesOperations operations + :vartype schedules: azure.ai.projects.operations.SchedulesOperations + :param endpoint: Foundry Project endpoint in the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}". + If you only have one Project in your Foundry Hub, or to target the default Project + in your Hub, use the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project". Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials.TokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str + :keyword int polling_interval: Default waiting time between two polls for LRO operations if no + Retry-After header is present. """ def __init__(self, endpoint: str, credential: "TokenCredential", **kwargs: Any) -> None: @@ -88,12 +104,22 @@ def __init__(self, endpoint: str, credential: "TokenCredential", **kwargs: Any) self._serialize = Serializer() self._deserialize = Deserializer() self._serialize.client_side_validation = False + self.agents = AgentsOperations(self._client, self._config, self._serialize, self._deserialize) + self.memory_stores = MemoryStoresOperations(self._client, self._config, self._serialize, self._deserialize) self.connections = ConnectionsOperations(self._client, self._config, self._serialize, self._deserialize) - self.evaluations = EvaluationsOperations(self._client, self._config, self._serialize, self._deserialize) self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluation_rules = EvaluationRulesOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.evaluation_taxonomies = EvaluationTaxonomiesOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.evaluators = EvaluatorsOperations(self._client, self._config, self._serialize, self._deserialize) + self.insights = InsightsOperations(self._client, self._config, self._serialize, self._deserialize) + self.schedules = SchedulesOperations(self._client, self._config, self._serialize, self._deserialize) def send_request(self, request: HttpRequest, *, stream: bool = False, **kwargs: Any) -> HttpResponse: """Runs the network request through the client's chained policies. diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_configuration.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_configuration.py index d1e88665ec2b..ad3f889051fe 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_configuration.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_configuration.py @@ -22,26 +22,22 @@ class AIProjectClientConfiguration: # pylint: disable=too-many-instance-attribu Note that all parameters used to create this instance are saved as instance attributes. - :param endpoint: Project endpoint. In the form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project - `_" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name - `_" - if you want to explicitly - specify the Foundry Project name. Required. + :param endpoint: Foundry Project endpoint in the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}". + If you only have one Project in your Foundry Hub, or to target the default Project + in your Hub, use the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project". Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials.TokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str """ def __init__(self, endpoint: str, credential: "TokenCredential", **kwargs: Any) -> None: - api_version: str = kwargs.pop("api_version", "2025-05-15-preview") + api_version: str = kwargs.pop("api_version", "2025-11-15-preview") if endpoint is None: raise ValueError("Parameter 'endpoint' must not be None.") diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_patch.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_patch.py index d03205d771ae..e0ac1f7e2c7a 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_patch.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_patch.py @@ -11,10 +11,8 @@ import logging from urllib.parse import urlparse from typing import List, Any, Optional, TYPE_CHECKING -from typing_extensions import Self from azure.core.tracing.decorator import distributed_trace from azure.core.credentials import TokenCredential -from azure.ai.agents import AgentsClient from ._client import AIProjectClient as AIProjectClientGenerated from .operations import TelemetryOperations from .models._enums import ConnectionType @@ -26,7 +24,7 @@ logger = logging.getLogger(__name__) -_console_logging_enabled: bool = os.environ.get("ENABLE_AZURE_AI_PROJECTS_CONSOLE_LOGGING", "False").lower() in ( +_console_logging_enabled: bool = os.environ.get("AZURE_AI_PROJECTS_CONSOLE_LOGGING", "False").lower() in ( "true", "1", "yes", @@ -87,14 +85,12 @@ def _get_aoai_inference_url(input_url: str) -> str: class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes """AIProjectClient. - :ivar agents: The AgentsClient associated with this AIProjectClient. - :vartype agents: azure.ai.agents.AgentsClient + :ivar agents: AgentsOperations operations + :vartype agents: azure.ai.projects.operations.AgentsOperations + :ivar memory_stores: MemoryStoresOperations operations + :vartype memory_stores: azure.ai.projects.operations.MemoryStoresOperations :ivar connections: ConnectionsOperations operations :vartype connections: azure.ai.projects.operations.ConnectionsOperations - :ivar telemetry: TelemetryOperations operations - :vartype telemetry: azure.ai.projects.operations.TelemetryOperations - :ivar evaluations: EvaluationsOperations operations - :vartype evaluations: azure.ai.projects.operations.EvaluationsOperations :ivar datasets: DatasetsOperations operations :vartype datasets: azure.ai.projects.operations.DatasetsOperations :ivar indexes: IndexesOperations operations @@ -103,18 +99,30 @@ class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-ins :vartype deployments: azure.ai.projects.operations.DeploymentsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.operations.RedTeamsOperations - :param endpoint: Project endpoint. In the form - "https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form "https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name" - if you want to explicitly specify the Foundry Project name. Required. + :ivar evaluation_rules: EvaluationRulesOperations operations + :vartype evaluation_rules: azure.ai.projects.operations.EvaluationRulesOperations + :ivar evaluation_taxonomies: EvaluationTaxonomiesOperations operations + :vartype evaluation_taxonomies: azure.ai.projects.operations.EvaluationTaxonomiesOperations + :ivar evaluators: EvaluatorsOperations operations + :vartype evaluators: azure.ai.projects.operations.EvaluatorsOperations + :ivar insights: InsightsOperations operations + :vartype insights: azure.ai.projects.operations.InsightsOperations + :ivar schedules: SchedulesOperations operations + :vartype schedules: azure.ai.projects.operations.SchedulesOperations + :param endpoint: Foundry Project endpoint in the form + ``https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}``. If + you only have one Project in your Foundry Hub, or to target the default Project in your Hub, + use the form + ``https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project``. Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials.TokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str + :keyword int polling_interval: Default waiting time between two polls for LRO operations if no + Retry-After header is present. """ def __init__(self, endpoint: str, credential: TokenCredential, **kwargs: Any) -> None: @@ -127,27 +135,165 @@ def __init__(self, endpoint: str, credential: TokenCredential, **kwargs: Any) -> super().__init__(endpoint=endpoint, credential=credential, **kwargs) self.telemetry = TelemetryOperations(self) # type: ignore - self._agents: Optional[AgentsClient] = None - @property - def agents(self) -> AgentsClient: # type: ignore[name-defined] - """Get the AgentsClient associated with this AIProjectClient. - The package azure.ai.agents must be installed to use this property. + @distributed_trace + def get_openai_client(self, **kwargs) -> "OpenAI": # type: ignore[name-defined] # pylint: disable=too-many-statements + """Get an authenticated OpenAI client from the `openai` package. + + Keyword arguments are passed to the OpenAI client constructor. + + The OpenAI client constructor is called with: + + * ``base_url`` set to the endpoint provided to the AIProjectClient constructor, with "/openai" appended. + * ``api-version`` set to "2025-05-15-preview" by default, unless overridden by the ``api_version`` keyword argument. + * ``api_key`` set to a get_bearer_token_provider() callable that uses the TokenCredential provided to the AIProjectClient constructor, with scope "https://ai.azure.com/.default". + + .. note:: The packages ``openai`` and ``azure.identity`` must be installed prior to calling this method. - :return: The AgentsClient associated with this AIProjectClient. - :rtype: azure.ai.agents.AgentsClient + :return: An authenticated OpenAI client + :rtype: ~openai.OpenAI + + :raises ~azure.core.exceptions.ModuleNotFoundError: if the ``openai`` package + is not installed. + :raises ~azure.core.exceptions.HttpResponseError: """ - if self._agents is None: - self._agents = AgentsClient( - endpoint=self._config.endpoint, - credential=self._config.credential, - user_agent=self._patched_user_agent, - **self._kwargs, - ) - return self._agents + + try: + from openai import OpenAI + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "OpenAI SDK is not installed. Please install it using 'pip install openai'" + ) from e + + try: + from azure.identity import get_bearer_token_provider + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "azure.identity package not installed. Please install it using 'pip install azure.identity'" + ) from e + + # TODO: Test the case where input endpoint URL has "/" at the end + openai_base_url = self._config.endpoint + "/openai" # pylint: disable=protected-access + + if "default_query" not in kwargs: + kwargs["default_query"] = {"api-version": "2025-11-15-preview"} + + logger.debug( # pylint: disable=specify-parameter-names-in-call + "[get_openai_client] Creating OpenAI client using Entra ID authentication, base_url = `%s`", # pylint: disable=line-too-long + openai_base_url, + ) + + http_client = None + + if _console_logging_enabled: + try: + import httpx + except ModuleNotFoundError as e: + raise ModuleNotFoundError("Failed to import httpx. Please install it using 'pip install httpx'") from e + + class OpenAILoggingTransport(httpx.HTTPTransport): + + def _sanitize_auth_header(self, headers) -> None: + """Sanitize authorization header by redacting sensitive information. + + :param headers: Dictionary of HTTP headers to sanitize + :type headers: dict + """ + + if "authorization" in headers: + auth_value = headers["authorization"] + if len(auth_value) >= 7: + headers["authorization"] = auth_value[:7] + "" + else: + headers["authorization"] = "" + + def handle_request(self, request: httpx.Request) -> httpx.Response: + """ + Log HTTP request and response details to console, in a nicely formatted way, + for OpenAI / Azure OpenAI clients. + + :param request: The HTTP request to handle and log + :type request: httpx.Request + + :return: The HTTP response received + :rtype: httpx.Response + """ + + print(f"\n==> Request:\n{request.method} {request.url}") + headers = dict(request.headers) + self._sanitize_auth_header(headers) + print("Headers:") + for key, value in headers.items(): + print(f" {key}: {value}") + + self._log_request_body(request) + + response = super().handle_request(request) + + print(f"\n<== Response:\n{response.status_code} {response.reason_phrase}") + print("Headers:") + for key, value in dict(response.headers).items(): + print(f" {key}: {value}") + try: + print(f"Body:\n {response.read().decode('utf-8')}") + except Exception: # pylint: disable=broad-exception-caught + print("Body:\n [non-text content]") + print("\n") + + return response + + def _log_request_body(self, request: httpx.Request) -> None: + """Log request body content safely, handling binary data and streaming content. + + :param request: The HTTP request object containing the body to log + :type request: httpx.Request + """ + + # Check content-type header to identify file uploads + content_type = request.headers.get("content-type", "").lower() + if "multipart/form-data" in content_type: + print("Body: [Multipart form data - file upload, not logged]") + return + + # Safely check if content exists without accessing it + if not hasattr(request, "content"): + print("Body: [No content attribute]") + return + + # Very careful content access - wrap in try-catch immediately + try: + content = request.content + except Exception as access_error: # pylint: disable=broad-exception-caught + print(f"Body: [Cannot access content: {access_error}]") + return + + # Check if content is None or empty + if content is None: + print("Body: [No content]") + return + + try: + print(f"Body:\n {content.decode('utf-8')}") + except Exception: # pylint: disable=broad-exception-caught + print(f"Body (raw):\n {content!r}") + + http_client = httpx.Client(transport=OpenAILoggingTransport()) + + client = OpenAI( + # See https://learn.microsoft.com/python/api/azure-identity/azure.identity?view=azure-python#azure-identity-get-bearer-token-provider # pylint: disable=line-too-long + api_key=get_bearer_token_provider( + self._config.credential, # pylint: disable=protected-access + "https://ai.azure.com/.default", + ), + base_url=openai_base_url, + http_client=http_client, + **kwargs, + ) + + return client @distributed_trace - def get_openai_client( + def get_openai_client_legacy( self, *, api_version: Optional[str] = None, connection_name: Optional[str] = None, **kwargs ) -> "OpenAI": # type: ignore[name-defined] """Get an authenticated AzureOpenAI client (from the `openai` package) to use with @@ -199,7 +345,7 @@ def get_openai_client( if isinstance(connection.credentials, ApiKeyCredentials): logger.debug( - "[get_openai_client] Creating OpenAI client using API key authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating OpenAI client using API key authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long connection_name, azure_endpoint, api_version, @@ -210,7 +356,7 @@ def get_openai_client( elif isinstance(connection.credentials, EntraIDCredentials): logger.debug( - "[get_openai_client] Creating OpenAI using Entra ID authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating OpenAI using Entra ID authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long connection_name, azure_endpoint, api_version, @@ -248,7 +394,7 @@ def get_openai_client( azure_endpoint = _get_aoai_inference_url(self._config.endpoint) # pylint: disable=protected-access logger.debug( # pylint: disable=specify-parameter-names-in-call - "[get_openai_client] Creating OpenAI client using Entra ID authentication, on parent AI Services resource, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating OpenAI client using Entra ID authentication, on parent AI Services resource, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long azure_endpoint, api_version, ) @@ -265,22 +411,6 @@ def get_openai_client( return client - def close(self) -> None: - if self._agents: - self.agents.close() - super().close() - - def __enter__(self) -> Self: - super().__enter__() - if self._agents: - self.agents.__enter__() - return self - - def __exit__(self, *exc_details: Any) -> None: - if self._agents: - self.agents.__exit__(*exc_details) - super().__exit__(*exc_details) - __all__: List[str] = [ "AIProjectClient", diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_types.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_types.py new file mode 100644 index 000000000000..5e23b3911701 --- /dev/null +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_types.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from typing import TYPE_CHECKING, Union + +if TYPE_CHECKING: + from . import models as _models +Filters = Union["_models.ComparisonFilter", "_models.CompoundFilter"] diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_utils/model_base.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_utils/model_base.py index 12926fa98dcf..03b8c4ce34a0 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_utils/model_base.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_utils/model_base.py @@ -6,7 +6,7 @@ # Code generated by Microsoft (R) Python Code Generator. # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -# pylint: disable=protected-access, broad-except +# pylint: disable=protected-access, broad-except, import-error, no-value-for-parameter import copy import calendar diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_validation.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_validation.py index f5af3a4eb8a2..31e9551354e8 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_validation.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_validation.py @@ -37,7 +37,7 @@ def wrapper(*args, **kwargs): except AttributeError: return func(*args, **kwargs) - if _index_with_default(method_added_on) > _index_with_default(client_api_version): + if False: # pylint: disable=using-constant-test raise ValueError( f"'{func.__name__}' is not available in API version " f"{client_api_version}. Pass service API version {method_added_on} or newer to your client." @@ -49,7 +49,7 @@ def wrapper(*args, **kwargs): for parameter in parameters if parameter in kwargs and _index_with_default(api_version) > _index_with_default(client_api_version) } - if unsupported: + if False: # pylint: disable=using-constant-test raise ValueError( "".join( [ diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/_version.py b/sdk/ai/azure-ai-projects/azure/ai/projects/_version.py index cffb9c489194..0e00a6283246 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/_version.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/_version.py @@ -6,4 +6,4 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -VERSION = "1.1.0b5" +VERSION = "2.0.0b1" diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_client.py b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_client.py index b6ee869a8126..62f0baa19f05 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_client.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_client.py @@ -17,25 +17,33 @@ from .._utils.serialization import Deserializer, Serializer from ._configuration import AIProjectClientConfiguration from .operations import ( + AgentsOperations, ConnectionsOperations, DatasetsOperations, DeploymentsOperations, - EvaluationsOperations, + EvaluationRulesOperations, + EvaluationTaxonomiesOperations, + EvaluatorsOperations, IndexesOperations, + InsightsOperations, + MemoryStoresOperations, RedTeamsOperations, + SchedulesOperations, ) if TYPE_CHECKING: from azure.core.credentials_async import AsyncTokenCredential -class AIProjectClient: +class AIProjectClient: # pylint: disable=too-many-instance-attributes """AIProjectClient. + :ivar agents: AgentsOperations operations + :vartype agents: azure.ai.projects.aio.operations.AgentsOperations + :ivar memory_stores: MemoryStoresOperations operations + :vartype memory_stores: azure.ai.projects.aio.operations.MemoryStoresOperations :ivar connections: ConnectionsOperations operations :vartype connections: azure.ai.projects.aio.operations.ConnectionsOperations - :ivar evaluations: EvaluationsOperations operations - :vartype evaluations: azure.ai.projects.aio.operations.EvaluationsOperations :ivar datasets: DatasetsOperations operations :vartype datasets: azure.ai.projects.aio.operations.DatasetsOperations :ivar indexes: IndexesOperations operations @@ -44,22 +52,30 @@ class AIProjectClient: :vartype deployments: azure.ai.projects.aio.operations.DeploymentsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.aio.operations.RedTeamsOperations - :param endpoint: Project endpoint. In the form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project - `_" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name - `_" - if you want to explicitly - specify the Foundry Project name. Required. + :ivar evaluation_rules: EvaluationRulesOperations operations + :vartype evaluation_rules: azure.ai.projects.aio.operations.EvaluationRulesOperations + :ivar evaluation_taxonomies: EvaluationTaxonomiesOperations operations + :vartype evaluation_taxonomies: azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations + :ivar evaluators: EvaluatorsOperations operations + :vartype evaluators: azure.ai.projects.aio.operations.EvaluatorsOperations + :ivar insights: InsightsOperations operations + :vartype insights: azure.ai.projects.aio.operations.InsightsOperations + :ivar schedules: SchedulesOperations operations + :vartype schedules: azure.ai.projects.aio.operations.SchedulesOperations + :param endpoint: Foundry Project endpoint in the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}". + If you only have one Project in your Foundry Hub, or to target the default Project + in your Hub, use the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project". Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials_async.AsyncTokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str + :keyword int polling_interval: Default waiting time between two polls for LRO operations if no + Retry-After header is present. """ def __init__(self, endpoint: str, credential: "AsyncTokenCredential", **kwargs: Any) -> None: @@ -88,12 +104,22 @@ def __init__(self, endpoint: str, credential: "AsyncTokenCredential", **kwargs: self._serialize = Serializer() self._deserialize = Deserializer() self._serialize.client_side_validation = False + self.agents = AgentsOperations(self._client, self._config, self._serialize, self._deserialize) + self.memory_stores = MemoryStoresOperations(self._client, self._config, self._serialize, self._deserialize) self.connections = ConnectionsOperations(self._client, self._config, self._serialize, self._deserialize) - self.evaluations = EvaluationsOperations(self._client, self._config, self._serialize, self._deserialize) self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluation_rules = EvaluationRulesOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.evaluation_taxonomies = EvaluationTaxonomiesOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.evaluators = EvaluatorsOperations(self._client, self._config, self._serialize, self._deserialize) + self.insights = InsightsOperations(self._client, self._config, self._serialize, self._deserialize) + self.schedules = SchedulesOperations(self._client, self._config, self._serialize, self._deserialize) def send_request( self, request: HttpRequest, *, stream: bool = False, **kwargs: Any diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_configuration.py b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_configuration.py index ecb337dfc5fa..39ed534eb174 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_configuration.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_configuration.py @@ -22,26 +22,22 @@ class AIProjectClientConfiguration: # pylint: disable=too-many-instance-attribu Note that all parameters used to create this instance are saved as instance attributes. - :param endpoint: Project endpoint. In the form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project - `_" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form - "`https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name - `_" - if you want to explicitly - specify the Foundry Project name. Required. + :param endpoint: Foundry Project endpoint in the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}". + If you only have one Project in your Foundry Hub, or to target the default Project + in your Hub, use the form + "https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project". Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials_async.AsyncTokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str """ def __init__(self, endpoint: str, credential: "AsyncTokenCredential", **kwargs: Any) -> None: - api_version: str = kwargs.pop("api_version", "2025-05-15-preview") + api_version: str = kwargs.pop("api_version", "2025-11-15-preview") if endpoint is None: raise ValueError("Parameter 'endpoint' must not be None.") diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_patch.py b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_patch.py index 1ebb5c65312f..5e7dc80c268b 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_patch.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/_patch.py @@ -10,10 +10,8 @@ import os import logging from typing import List, Any, Optional, TYPE_CHECKING -from typing_extensions import Self from azure.core.tracing.decorator_async import distributed_trace_async from azure.core.credentials_async import AsyncTokenCredential -from azure.ai.agents.aio import AgentsClient from ._client import AIProjectClient as AIProjectClientGenerated from .._patch import _patch_user_agent from .operations import TelemetryOperations @@ -27,7 +25,7 @@ logger = logging.getLogger(__name__) -_console_logging_enabled: bool = os.environ.get("ENABLE_AZURE_AI_PROJECTS_CONSOLE_LOGGING", "False").lower() in ( +_console_logging_enabled: bool = os.environ.get("AZURE_AI_PROJECTS_CONSOLE_LOGGING", "False").lower() in ( "true", "1", "yes", @@ -52,14 +50,12 @@ class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes """AIProjectClient. - :ivar agents: The asynchronous AgentsClient associated with this AIProjectClient. - :vartype agents: azure.ai.agents.aio.AgentsClient + :ivar agents: AgentsOperations operations + :vartype agents: azure.ai.projects.aio.operations.AgentsOperations + :ivar memory_stores: MemoryStoresOperations operations + :vartype memory_stores: azure.ai.projects.aio.operations.MemoryStoresOperations :ivar connections: ConnectionsOperations operations :vartype connections: azure.ai.projects.aio.operations.ConnectionsOperations - :ivar telemetry: TelemetryOperations operations - :vartype telemetry: azure.ai.projects.aio.operations.TelemetryOperations - :ivar evaluations: EvaluationsOperations operations - :vartype evaluations: azure.ai.projects.aio.operations.EvaluationsOperations :ivar datasets: DatasetsOperations operations :vartype datasets: azure.ai.projects.aio.operations.DatasetsOperations :ivar indexes: IndexesOperations operations @@ -68,18 +64,30 @@ class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-ins :vartype deployments: azure.ai.projects.aio.operations.DeploymentsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.aio.operations.RedTeamsOperations - :param endpoint: Project endpoint. In the form - "https://your-ai-services-account-name.services.ai.azure.com/api/projects/_project" - if your Foundry Hub has only one Project, or to use the default Project in your Hub. Or in the - form "https://your-ai-services-account-name.services.ai.azure.com/api/projects/your-project-name" - if you want to explicitly specify the Foundry Project name. Required. + :ivar evaluation_rules: EvaluationRulesOperations operations + :vartype evaluation_rules: azure.ai.projects.aio.operations.EvaluationRulesOperations + :ivar evaluation_taxonomies: EvaluationTaxonomiesOperations operations + :vartype evaluation_taxonomies: azure.ai.projects.aio.operations.EvaluationTaxonomiesOperations + :ivar evaluators: EvaluatorsOperations operations + :vartype evaluators: azure.ai.projects.aio.operations.EvaluatorsOperations + :ivar insights: InsightsOperations operations + :vartype insights: azure.ai.projects.aio.operations.InsightsOperations + :ivar schedules: SchedulesOperations operations + :vartype schedules: azure.ai.projects.aio.operations.SchedulesOperations + :param endpoint: Foundry Project endpoint in the form + ``https://{ai-services-account-name}.services.ai.azure.com/api/projects/{project-name}``. If + you only have one Project in your Foundry Hub, or to target the default Project in your Hub, + use the form + ``https://{ai-services-account-name}.services.ai.azure.com/api/projects/_project``. Required. :type endpoint: str :param credential: Credential used to authenticate requests to the service. Required. :type credential: ~azure.core.credentials_async.AsyncTokenCredential :keyword api_version: The API version to use for this operation. Default value is - "2025-05-15-preview". Note that overriding this default value may result in unsupported + "2025-11-15-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str + :keyword int polling_interval: Default waiting time between two polls for LRO operations if no + Retry-After header is present. """ def __init__(self, endpoint: str, credential: AsyncTokenCredential, **kwargs: Any) -> None: @@ -92,27 +100,166 @@ def __init__(self, endpoint: str, credential: AsyncTokenCredential, **kwargs: An super().__init__(endpoint=endpoint, credential=credential, **kwargs) self.telemetry = TelemetryOperations(self) # type: ignore - self._agents: Optional[AgentsClient] = None - @property - def agents(self) -> AgentsClient: # type: ignore[name-defined] - """Get the asynchronous AgentsClient associated with this AIProjectClient. - The package azure.ai.agents must be installed to use this property. + @distributed_trace_async + async def get_openai_client(self, **kwargs) -> "AsyncOpenAI": # type: ignore[name-defined] # pylint: disable=too-many-statements + """Get an authenticated AsyncOpenAI client from the `openai` package. + + Keyword arguments are passed to the AsyncOpenAI client constructor. + + The AsyncOpenAI client constructor is called with: + + * ``base_url`` set to the endpoint provided to the AIProjectClient constructor, with "/openai" appended. + * ``api-version`` set to "2025-05-15-preview" by default, unless overridden by the ``api_version`` keyword argument. + * ``api_key`` set to a get_bearer_token_provider() callable that uses the TokenCredential provided to the AIProjectClient constructor, with scope "https://ai.azure.com/.default". + + .. note:: The packages ``openai`` and ``azure.identity`` must be installed prior to calling this method. - :return: The asynchronous AgentsClient associated with this AIProjectClient. - :rtype: azure.ai.agents.aio.AgentsClient + :return: An authenticated AsyncOpenAI client + :rtype: ~openai.AsyncOpenAI + + :raises ~azure.core.exceptions.ModuleNotFoundError: if the ``openai`` package + is not installed. + :raises ~azure.core.exceptions.HttpResponseError: """ - if self._agents is None: - self._agents = AgentsClient( - endpoint=self._config.endpoint, - credential=self._config.credential, - user_agent=self._patched_user_agent, - **self._kwargs, - ) - return self._agents + + try: + from openai import AsyncOpenAI + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "OpenAI SDK is not installed. Please install it using 'pip install openai'" + ) from e + + try: + from azure.identity.aio import get_bearer_token_provider + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "azure.identity package not installed. Please install it using 'pip install azure.identity'" + ) from e + + # TODO: Test the case where input endpoint URL has "/" at the end + base_url = self._config.endpoint + "/openai" # pylint: disable=protected-access + + if "default_query" not in kwargs: + kwargs["default_query"] = {"api-version": "2025-11-15-preview"} + + logger.debug( # pylint: disable=specify-parameter-names-in-call + "[get_openai_client] Creating OpenAI client using Entra ID authentication, base_url = `%s`", # pylint: disable=line-too-long + base_url, + ) + + http_client = None + + if _console_logging_enabled: + try: + import httpx + except ModuleNotFoundError as e: + raise ModuleNotFoundError("Failed to import httpx. Please install it using 'pip install httpx'") from e + + class OpenAILoggingTransport(httpx.AsyncHTTPTransport): + + def _sanitize_auth_header(self, headers): + """Sanitize authorization header by redacting sensitive information. + + :param headers: Dictionary of HTTP headers to sanitize + :type headers: dict + """ + + if "authorization" in headers: + auth_value = headers["authorization"] + if len(auth_value) >= 7: + headers["authorization"] = auth_value[:7] + "" + else: + headers["authorization"] = "" + + async def handle_async_request(self, request: httpx.Request) -> httpx.Response: + """ + Log HTTP request and response details to console, in a nicely formatted way, + for OpenAI / Azure OpenAI clients. + + :param request: The HTTP request to handle and log + :type request: httpx.Request + + :return: The HTTP response received + :rtype: httpx.Response + """ + + print(f"\n==> Request:\n{request.method} {request.url}") + headers = dict(request.headers) + self._sanitize_auth_header(headers) + print("Headers:") + for key, value in headers.items(): + print(f" {key}: {value}") + + self._log_request_body(request) + + response = await super().handle_async_request(request) + + print(f"\n<== Response:\n{response.status_code} {response.reason_phrase}") + print("Headers:") + for key, value in dict(response.headers).items(): + print(f" {key}: {value}") + try: + content = await response.aread() + print(f"Body:\n {content.decode('utf-8')}") + except Exception: # pylint: disable=broad-exception-caught + print("Body:\n [non-text content]") + print("\n") + + return response + + def _log_request_body(self, request: httpx.Request) -> None: + """Log request body content safely, handling binary data and streaming content. + + :param request: The HTTP request object containing the body to log + :type request: httpx.Request + """ + + # Check content-type header to identify file uploads + content_type = request.headers.get("content-type", "").lower() + if "multipart/form-data" in content_type: + print("Body: [Multipart form data - file upload, not logged]") + return + + # Safely check if content exists without accessing it + if not hasattr(request, "content"): + print("Body: [No content attribute]") + return + + # Very careful content access - wrap in try-catch immediately + try: + content = request.content + except Exception as access_error: # pylint: disable=broad-exception-caught + print(f"Body: [Cannot access content: {access_error}]") + return + + # Check if content is None or empty + if content is None: + print("Body: [No content]") + return + + try: + print(f"Body:\n {content.decode('utf-8')}") + except Exception: # pylint: disable=broad-exception-caught + print(f"Body (raw):\n {content!r}") + + http_client = httpx.AsyncClient(transport=OpenAILoggingTransport()) + + client = AsyncOpenAI( + # See https://learn.microsoft.com/python/api/azure-identity/azure.identity?view=azure-python#azure-identity-get-bearer-token-provider # pylint: disable=line-too-long + api_key=get_bearer_token_provider( + self._config.credential, # pylint: disable=protected-access + "https://ai.azure.com/.default", + ), + base_url=base_url, + http_client=http_client, + **kwargs, + ) + + return client @distributed_trace_async - async def get_openai_client( + async def get_openai_client_legacy( self, *, api_version: Optional[str] = None, connection_name: Optional[str] = None, **kwargs ) -> "AsyncOpenAI": # type: ignore[name-defined] """Get an authenticated AsyncAzureOpenAI client (from the `openai` package) to use with @@ -164,7 +311,7 @@ async def get_openai_client( if isinstance(connection.credentials, ApiKeyCredentials): logger.debug( - "[get_openai_client] Creating AsyncOpenAI client using API key authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating AsyncOpenAI client using API key authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long connection_name, azure_endpoint, api_version, @@ -175,7 +322,7 @@ async def get_openai_client( elif isinstance(connection.credentials, EntraIDCredentials): logger.debug( - "[get_openai_client] Creating AsyncOpenAI using Entra ID authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating AsyncOpenAI using Entra ID authentication, on connection `%s`, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long connection_name, azure_endpoint, api_version, @@ -213,7 +360,7 @@ async def get_openai_client( azure_endpoint = _get_aoai_inference_url(self._config.endpoint) # pylint: disable=protected-access logger.debug( # pylint: disable=specify-parameter-names-in-call - "[get_openai_client] Creating AzureOpenAI client using Entra ID authentication, on parent AI Services resource, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long + "[get_openai_client_legacy] Creating AzureOpenAI client using Entra ID authentication, on parent AI Services resource, endpoint `%s`, api_version `%s`", # pylint: disable=line-too-long azure_endpoint, api_version, ) @@ -230,22 +377,6 @@ async def get_openai_client( return client - async def close(self) -> None: - if self._agents: - await self.agents.close() - await super().close() - - async def __aenter__(self) -> Self: - await super().__aenter__() - if self._agents: - await self.agents.__aenter__() - return self - - async def __aexit__(self, *exc_details: Any) -> None: - if self._agents: - await self.agents.__aexit__(*exc_details) - await super().__aexit__(*exc_details) - __all__: List[str] = ["AIProjectClient"] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/__init__.py b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/__init__.py index 3cfd5a29391a..5ae1225f30fa 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/__init__.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/__init__.py @@ -12,24 +12,36 @@ if TYPE_CHECKING: from ._patch import * # pylint: disable=unused-wildcard-import +from ._operations import AgentsOperations # type: ignore +from ._operations import MemoryStoresOperations # type: ignore from ._operations import ConnectionsOperations # type: ignore -from ._operations import EvaluationsOperations # type: ignore from ._operations import DatasetsOperations # type: ignore from ._operations import IndexesOperations # type: ignore from ._operations import DeploymentsOperations # type: ignore from ._operations import RedTeamsOperations # type: ignore +from ._operations import EvaluationRulesOperations # type: ignore +from ._operations import EvaluationTaxonomiesOperations # type: ignore +from ._operations import EvaluatorsOperations # type: ignore +from ._operations import InsightsOperations # type: ignore +from ._operations import SchedulesOperations # type: ignore from ._patch import __all__ as _patch_all from ._patch import * from ._patch import patch_sdk as _patch_sdk __all__ = [ + "AgentsOperations", + "MemoryStoresOperations", "ConnectionsOperations", - "EvaluationsOperations", "DatasetsOperations", "IndexesOperations", "DeploymentsOperations", "RedTeamsOperations", + "EvaluationRulesOperations", + "EvaluationTaxonomiesOperations", + "EvaluatorsOperations", + "InsightsOperations", + "SchedulesOperations", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore _patch_sdk() diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/_operations.py b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/_operations.py index f2f68e188fcf..095b32b92f72 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/_operations.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/aio/operations/_operations.py @@ -1,4 +1,4 @@ -# pylint: disable=too-many-lines +# pylint: disable=line-too-long,useless-suppression,too-many-lines # coding=utf-8 # -------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. @@ -9,7 +9,7 @@ from collections.abc import MutableMapping from io import IOBase import json -from typing import Any, Callable, IO, Optional, TypeVar, Union, overload +from typing import Any, AsyncIterator, Callable, IO, Literal, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -25,16 +25,38 @@ map_error, ) from azure.core.pipeline import PipelineResponse +from azure.core.polling import AsyncLROPoller, AsyncNoPolling, AsyncPollingMethod +from azure.core.polling.async_base_polling import AsyncLROBasePolling from azure.core.rest import AsyncHttpResponse, HttpRequest from azure.core.tracing.decorator import distributed_trace from azure.core.tracing.decorator_async import distributed_trace_async from azure.core.utils import case_insensitive_dict from ... import models as _models -from ..._utils.model_base import SdkJSONEncoder, _deserialize +from ..._utils.model_base import SdkJSONEncoder, _deserialize, _failsafe_deserialize from ..._utils.serialization import Deserializer, Serializer from ..._validation import api_version_validation from ...operations._operations import ( + build_agents_create_agent_from_manifest_request, + build_agents_create_agent_version_from_manifest_request, + build_agents_create_request, + build_agents_create_version_request, + build_agents_delete_container_request, + build_agents_delete_request, + build_agents_delete_version_request, + build_agents_list_container_operations_request, + build_agents_list_request, + build_agents_list_version_container_operations_request, + build_agents_list_versions_request, + build_agents_retrieve_container_operation_request, + build_agents_retrieve_container_request, + build_agents_retrieve_request, + build_agents_retrieve_version_request, + build_agents_start_container_request, + build_agents_stop_container_request, + build_agents_update_agent_from_manifest_request, + build_agents_update_container_request, + build_agents_update_request, build_connections_get_request, build_connections_get_with_credentials_request, build_connections_list_request, @@ -47,54 +69,5258 @@ build_datasets_pending_upload_request, build_deployments_get_request, build_deployments_list_request, - build_evaluations_cancel_request, - build_evaluations_create_agent_evaluation_request, - build_evaluations_create_request, - build_evaluations_delete_request, - build_evaluations_get_request, - build_evaluations_list_request, + build_evaluation_rules_create_or_update_request, + build_evaluation_rules_delete_request, + build_evaluation_rules_get_request, + build_evaluation_rules_list_request, + build_evaluation_taxonomies_create_request, + build_evaluation_taxonomies_delete_request, + build_evaluation_taxonomies_get_request, + build_evaluation_taxonomies_list_request, + build_evaluation_taxonomies_update_request, + build_evaluators_create_version_request, + build_evaluators_delete_version_request, + build_evaluators_get_version_request, + build_evaluators_list_latest_versions_request, + build_evaluators_list_versions_request, + build_evaluators_update_version_request, build_indexes_create_or_update_request, build_indexes_delete_request, build_indexes_get_request, build_indexes_list_request, build_indexes_list_versions_request, + build_insights_generate_request, + build_insights_get_request, + build_insights_list_request, + build_memory_stores_create_memory_store_request, + build_memory_stores_delete_memory_store_request, + build_memory_stores_delete_scope_request, + build_memory_stores_get_memory_store_request, + build_memory_stores_get_update_result_request, + build_memory_stores_list_memory_stores_request, + build_memory_stores_search_memories_request, + build_memory_stores_update_memories_request, + build_memory_stores_update_memory_store_request, build_red_teams_create_request, build_red_teams_get_request, build_red_teams_list_request, + build_schedules_create_or_update_request, + build_schedules_delete_request, + build_schedules_get_request, + build_schedules_get_run_request, + build_schedules_list_request, + build_schedules_list_runs_request, ) from .._configuration import AIProjectClientConfiguration +JSON = MutableMapping[str, Any] +_Unset: Any = object() T = TypeVar("T") ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -JSON = MutableMapping[str, Any] List = list -class ConnectionsOperations: +class AgentsOperations: """ .. warning:: **DO NOT** instantiate this class directly. - Instead, you should access the following operations through - :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`connections` attribute. - """ + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`agents` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def retrieve(self, agent_name: str, **kwargs: Any) -> _models.AgentObject: + """Retrieves the agent. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_request( + agent_name=agent_name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def create( + self, + *, + name: str, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates the agent. + + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create(self, body: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.AgentObject: + """Creates the agent. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Creates the agent. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates the agent. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata, "name": name} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def update( + self, + agent_name: str, + *, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def update( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def create_agent_from_manifest( + self, + *, + name: str, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_agent_from_manifest( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_agent_from_manifest( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create_agent_from_manifest( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "name": name, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_agent_from_manifest_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def update_agent_from_manifest( + self, + agent_name: str, + *, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_agent_from_manifest( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_agent_from_manifest( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def update_agent_from_manifest( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_agent_from_manifest_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete(self, agent_name: str, **kwargs: Any) -> _models.DeleteAgentResponse: + """Deletes an agent. + + :param agent_name: The name of the agent to delete. Required. + :type agent_name: str + :return: DeleteAgentResponse. The DeleteAgentResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DeleteAgentResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteAgentResponse] = kwargs.pop("cls", None) + + _request = build_agents_delete_request( + agent_name=agent_name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteAgentResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "kind", "limit", "order", "after", "before", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, + *, + kind: Optional[Union[str, _models.AgentKind]] = None, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.AgentObject"]: + """Returns the list of all agents. + + :keyword kind: Filter agents by kind. If not provided, all agents are returned. Known values + are: "prompt", "hosted", "container_app", and "workflow". Default value is None. + :paramtype kind: str or ~azure.ai.projects.models.AgentKind + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentObject + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.AgentObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_request( + kind=kind, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, AsyncList(list_of_elem) + + async def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @overload + async def create_version( + self, + agent_name: str, + *, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create_version( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + if body is _Unset: + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_version_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def create_agent_version_from_manifest( + self, + agent_name: str, + *, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_agent_version_from_manifest( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_agent_version_from_manifest( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create_agent_version_from_manifest( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + if body is _Unset: + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_agent_version_from_manifest_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def retrieve_version(self, agent_name: str, agent_version: str, **kwargs: Any) -> _models.AgentVersionObject: + """Retrieves a specific version of an agent. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param agent_version: The version of the agent to retrieve. Required. + :type agent_version: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_version_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete_version( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.DeleteAgentVersionResponse: + """Deletes a specific version of an agent. + + :param agent_name: The name of the agent to delete. Required. + :type agent_name: str + :param agent_version: The version of the agent to delete. Required. + :type agent_version: str + :return: DeleteAgentVersionResponse. The DeleteAgentVersionResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.DeleteAgentVersionResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteAgentVersionResponse] = kwargs.pop("cls", None) + + _request = build_agents_delete_version_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteAgentVersionResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "limit", "order", "after", "before", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_versions( + self, + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.AgentVersionObject"]: + """Returns the list of versions of an agent. + + :param agent_name: The name of the agent to retrieve versions for. Required. + :type agent_name: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentVersionObject + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.AgentVersionObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentVersionObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_versions_request( + agent_name=agent_name, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentVersionObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, AsyncList(list_of_elem) + + async def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @overload + async def start_container( + self, + agent_name: str, + agent_version: str, + *, + content_type: str = "application/json", + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword min_replicas: The minimum number of replicas. Defaults to 1. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Defaults to 1. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_container( + self, agent_name: str, agent_version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_container( + self, + agent_name: str, + agent_version: str, + body: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "agent_version", "content_type", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + async def start_container( + self, + agent_name: str, + agent_version: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword min_replicas: The minimum number of replicas. Defaults to 1. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Defaults to 1. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"max_replicas": max_replicas, "min_replicas": min_replicas} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_start_container_request( + agent_name=agent_name, + agent_version=agent_version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def update_container( + self, + agent_name: str, + agent_version: str, + *, + content_type: str = "application/json", + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword min_replicas: The minimum number of replicas. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_container( + self, agent_name: str, agent_version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_container( + self, + agent_name: str, + agent_version: str, + body: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "agent_version", "content_type", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + async def update_container( + self, + agent_name: str, + agent_version: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword min_replicas: The minimum number of replicas. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"max_replicas": max_replicas, "min_replicas": min_replicas} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_container_request( + agent_name=agent_name, + agent_version=agent_version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def stop_container( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Stop a container for a specific version of an agent. If the container is not running, or + already stopped, the operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_stop_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete_container( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Delete a container for a specific version of an agent. If the container doesn't exist, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_delete_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def retrieve_container( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.AgentContainerObject: + """Get a container for a specific version of an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerObject. The AgentContainerObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "operation_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def retrieve_container_operation( + self, agent_name: str, operation_id: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Get the status of a container operation for an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param operation_id: The operation ID. Required. + :type operation_id: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_container_operation_request( + agent_name=agent_name, + operation_id=operation_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "limit", "order", "after", "before", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_container_operations( + self, + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.AgentContainerOperationObject"]: + """List container operations for an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentContainerOperationObject + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.AgentContainerOperationObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentContainerOperationObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_container_operations_request( + agent_name=agent_name, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentContainerOperationObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, AsyncList(list_of_elem) + + async def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "agent_name", + "agent_version", + "limit", + "order", + "after", + "before", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_version_container_operations( + self, + agent_name: str, + agent_version: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.AgentContainerOperationObject"]: + """List container operations for a specific version of an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentContainerOperationObject + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.AgentContainerOperationObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentContainerOperationObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_version_container_operations_request( + agent_name=agent_name, + agent_version=agent_version, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentContainerOperationObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, AsyncList(list_of_elem) + + async def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + +class MemoryStoresOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`memory_stores` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @overload + async def create_memory_store( + self, + *, + name: str, + definition: _models.MemoryStoreDefinition, + content_type: str = "application/json", + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :keyword name: The name of the memory store. Required. + :paramtype name: str + :keyword definition: The memory store definition. Required. + :paramtype definition: ~azure.ai.projects.models.MemoryStoreDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_memory_store( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_memory_store( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create_memory_store( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + definition: _models.MemoryStoreDefinition = _Unset, + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The name of the memory store. Required. + :paramtype name: str + :keyword definition: The memory store definition. Required. + :paramtype definition: ~azure.ai.projects.models.MemoryStoreDefinition + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata, "name": name} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_create_memory_store_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def update_memory_store( + self, + name: str, + *, + content_type: str = "application/json", + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_memory_store( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def update_memory_store( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def update_memory_store( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_update_memory_store_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get_memory_store(self, name: str, **kwargs: Any) -> _models.MemoryStoreObject: + """Retrieve a memory store. + + :param name: The name of the memory store to retrieve. Required. + :type name: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + _request = build_memory_stores_get_memory_store_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "limit", "order", "after", "before", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_memory_stores( + self, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.MemoryStoreObject"]: + """List all memory stores. + + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of MemoryStoreObject + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.MemoryStoreObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.MemoryStoreObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_memory_stores_list_memory_stores_request( + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.MemoryStoreObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, AsyncList(list_of_elem) + + async def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete_memory_store(self, name: str, **kwargs: Any) -> _models.DeleteMemoryStoreResponse: + """Delete a memory store. + + :param name: The name of the memory store to delete. Required. + :type name: str + :return: DeleteMemoryStoreResponse. The DeleteMemoryStoreResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.DeleteMemoryStoreResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteMemoryStoreResponse] = kwargs.pop("cls", None) + + _request = build_memory_stores_delete_memory_store_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteMemoryStoreResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def search_memories( + self, + name: str, + *, + scope: str, + content_type: str = "application/json", + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_search_id: Optional[str] = None, + options: Optional[_models.MemorySearchOptions] = None, + **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword conversation_id: The conversation ID for which to search memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Items for which to search for relevant memories. Only one of conversation_id or + items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_search_id: The unique ID of the previous search request, enabling incremental + memory search from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_search_id: str + :keyword options: Memory search options. Default value is None. + :paramtype options: ~azure.ai.projects.models.MemorySearchOptions + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def search_memories( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def search_memories( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def search_memories( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_search_id: Optional[str] = None, + options: Optional[_models.MemorySearchOptions] = None, + **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword conversation_id: The conversation ID for which to search memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Items for which to search for relevant memories. Only one of conversation_id or + items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_search_id: The unique ID of the previous search request, enabling incremental + memory search from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_search_id: str + :keyword options: Memory search options. Default value is None. + :paramtype options: ~azure.ai.projects.models.MemorySearchOptions + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreSearchResponse] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = { + "conversation_id": conversation_id, + "items_property": items, + "options": options, + "previous_search_id": previous_search_id, + "scope": scope, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_search_memories_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreSearchResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def _update_memories_initial( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> AsyncIterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[AsyncIterator[bytes]] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = { + "conversation_id": conversation_id, + "items_property": items, + "previous_update_id": previous_update_id, + "scope": scope, + "update_delay": update_delay, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_update_memories_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = True + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + deserialized = response.iter_bytes() + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def begin_update_memories( + self, + name: str, + *, + scope: str, + content_type: str = "application/json", + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> AsyncLROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword conversation_id: The conversation ID from which to extract memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Conversation items from which to extract memories. Only one of conversation_id + or items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_update_id: The unique ID of the previous update request, enabling incremental + memory updates from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_update_id: str + :keyword update_delay: Timeout period before processing the memory update in seconds. + If a new update request is received during this period, it will cancel the current request and + reset the timeout. + Set to 0 to immediately trigger the update without delay. + Defaults to 300 (5 minutes). Default value is None. + :paramtype update_delay: int + :return: An instance of AsyncLROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.AsyncLROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def begin_update_memories( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> AsyncLROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of AsyncLROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.AsyncLROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def begin_update_memories( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> AsyncLROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of AsyncLROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.AsyncLROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def begin_update_memories( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> AsyncLROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword conversation_id: The conversation ID from which to extract memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Conversation items from which to extract memories. Only one of conversation_id + or items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_update_id: The unique ID of the previous update request, enabling incremental + memory updates from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_update_id: str + :keyword update_delay: Timeout period before processing the memory update in seconds. + If a new update request is received during this period, it will cancel the current request and + reset the timeout. + Set to 0 to immediately trigger the update without delay. + Defaults to 300 (5 minutes). Default value is None. + :paramtype update_delay: int + :return: An instance of AsyncLROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.AsyncLROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreUpdateResult] = kwargs.pop("cls", None) + polling: Union[bool, AsyncPollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = await self._update_memories_initial( + name=name, + body=body, + scope=scope, + conversation_id=conversation_id, + items=items, + previous_update_id=previous_update_id, + update_delay=update_delay, + content_type=content_type, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + await raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + response_headers = {} + response = pipeline_response.http_response + response_headers["Operation-Location"] = self._deserialize( + "str", response.headers.get("Operation-Location") + ) + + deserialized = _deserialize(_models.MemoryStoreUpdateResult, response.json().get("result", {})) + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + return deserialized + + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + + if polling is True: + polling_method: AsyncPollingMethod = cast( + AsyncPollingMethod, + AsyncLROBasePolling(lro_delay, path_format_arguments=path_format_arguments, **kwargs), + ) + elif polling is False: + polling_method = cast(AsyncPollingMethod, AsyncNoPolling()) + else: + polling_method = polling + if cont_token: + return AsyncLROPoller[_models.MemoryStoreUpdateResult].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return AsyncLROPoller[_models.MemoryStoreUpdateResult]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "update_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get_update_result(self, name: str, update_id: str, **kwargs: Any) -> _models.MemoryStoreUpdateResponse: + """Get memory store update result. + + :param name: The name of the memory store. Required. + :type name: str + :param update_id: The ID of the memory update operation. Required. + :type update_id: str + :return: MemoryStoreUpdateResponse. The MemoryStoreUpdateResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreUpdateResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.MemoryStoreUpdateResponse] = kwargs.pop("cls", None) + + _request = build_memory_stores_get_update_result_request( + name=name, + update_id=update_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreUpdateResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def delete_scope( + self, name: str, *, scope: str, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories to delete, such as a + user ID. Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def delete_scope( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def delete_scope( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete_scope( + self, name: str, body: Union[JSON, IO[bytes]] = _Unset, *, scope: str = _Unset, **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories to delete, such as a + user ID. Required. + :paramtype scope: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreDeleteScopeResponse] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = {"scope": scope} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_delete_scope_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreDeleteScopeResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class ConnectionsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`connections` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + async def _get(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, without populating connection credentials. + + :param name: The friendly name of the connection, provided by the user. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. + + :param name: The friendly name of the connection, provided by the user. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_with_credentials_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.Connection"]: + """List all connections in the project, without populating connection credentials. + + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", "CustomKeys", and "RemoteTool". Default value is None. + :paramtype connection_type: str or ~azure.ai.projects.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool + :return: An iterator like instance of Connection + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Connection] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_connections_list_request( + connection_type=connection_type, + default_connection=default_connection, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + +class DatasetsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`datasets` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.DatasetVersion"]: + """List all versions of the given DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_versions_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + def list(self, **kwargs: Any) -> AsyncItemPaged["_models.DatasetVersion"]: + """List the latest version of each DatasetVersion. + + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + async def get(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: + """Get the specific version of the DatasetVersion. The service returns 404 Not Found error if the + DatasetVersion does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to retrieve. Required. + :type version: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + _request = build_datasets_get_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def delete(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the DatasetVersion. The service returns 204 No Content if the + DatasetVersion was deleted successfully or if the DatasetVersion does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the DatasetVersion to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_datasets_delete_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + async def create_or_update( + self, + name: str, + version: str, + dataset_version: _models.DatasetVersion, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: ~azure.ai.projects.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, + name: str, + version: str, + dataset_version: JSON, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, + name: str, + version: str, + dataset_version: IO[bytes], + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def create_or_update( + self, name: str, version: str, dataset_version: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type dataset_version: ~azure.ai.projects.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/merge-patch+json" + _content = None + if isinstance(dataset_version, (IOBase, bytes)): + _content = dataset_version + else: + _content = json.dumps(dataset_version, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_or_update_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def pending_upload( + self, + name: str, + version: str, + pending_upload_request: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def pending_upload( + self, + name: str, + version: str, + pending_upload_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def pending_upload( + self, + name: str, + version: str, + pending_upload_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def pending_upload( + self, + name: str, + version: str, + pending_upload_request: Union[_models.PendingUploadRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Is one of the following + types: PendingUploadRequest, JSON, IO[bytes] Required. + :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest or JSON or + IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(pending_upload_request, (IOBase, bytes)): + _content = pending_upload_request + else: + _content = json.dumps(pending_upload_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_pending_upload_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def get_credentials(self, name: str, version: str, **kwargs: Any) -> _models.DatasetCredential: + """Get the SAS credential to access the storage account associated with a Dataset version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :return: DatasetCredential. The DatasetCredential is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetCredential + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetCredential] = kwargs.pop("cls", None) + + _request = build_datasets_get_credentials_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetCredential, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class IndexesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`indexes` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.Index"]: + """List all versions of the given Index. + + :param name: The name of the resource. Required. + :type name: str + :return: An iterator like instance of Index + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_versions_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Index"]: + """List the latest version of each Index. + + :return: An iterator like instance of Index + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + async def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: + """Get the specific version of the Index. The service returns 404 Not Found error if the Index + does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to retrieve. Required. + :type version: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + _request = build_indexes_get_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def delete(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the Index. The service returns 204 No Content if the Index was + deleted successfully or if the Index does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the Index to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_indexes_delete_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + async def create_or_update( + self, + name: str, + version: str, + index: _models.Index, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: ~azure.ai.projects.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, name: str, version: str, index: JSON, *, content_type: str = "application/merge-patch+json", **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, + name: str, + version: str, + index: IO[bytes], + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async - async def _get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name, without populating connection credentials. + async def create_or_update( + self, name: str, version: str, index: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. - :param name: The friendly name of the connection, provided by the user. Required. + :param name: The name of the resource. Required. :type name: str - :return: Connection. The Connection is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Connection + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type index: ~azure.ai.projects.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -105,14 +5331,25 @@ async def _get(self, name: str, **kwargs: Any) -> _models.Connection: } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = kwargs.pop("headers", {}) or {} + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) - _request = build_connections_get_request( + content_type = content_type or "application/merge-patch+json" + _content = None + if isinstance(index, (IOBase, bytes)): + _content = index + else: + _content = json.dumps(index, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_or_update_request( name=name, + version=version, + content_type=content_type, api_version=self._config.api_version, + content=_content, headers=_headers, params=_params, ) @@ -128,7 +5365,7 @@ async def _get(self, name: str, **kwargs: Any) -> _models.Connection: response = pipeline_response.http_response - if response.status_code not in [200]: + if response.status_code not in [200, 201]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -137,29 +5374,42 @@ async def _get(self, name: str, **kwargs: Any) -> _models.Connection: map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Connection, response.json()) + deserialized = _deserialize(_models.Index, response.json()) if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore + +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`deployments` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + @distributed_trace_async - async def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name, with its connection credentials. + async def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. - :param name: The friendly name of the connection, provided by the user. Required. + :param name: Name of the deployment. Required. :type name: str - :return: Connection. The Connection is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Connection + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Deployment :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -173,9 +5423,9 @@ async def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Conne _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) - _request = build_connections_get_with_credentials_request( + _request = build_deployments_get_request( name=name, api_version=self._config.api_version, headers=_headers, @@ -210,7 +5460,7 @@ async def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Conne if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Connection, response.json()) + deserialized = _deserialize(_models.Deployment, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -221,27 +5471,29 @@ async def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Conne def list( self, *, - connection_type: Optional[Union[str, _models.ConnectionType]] = None, - default_connection: Optional[bool] = None, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + deployment_type: Optional[Union[str, _models.DeploymentType]] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.Connection"]: - """List all connections in the project, without populating connection credentials. + ) -> AsyncItemPaged["_models.Deployment"]: + """List all deployed models in the project. - :keyword connection_type: List connections of this specific type. Known values are: - "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", - "AppConfig", "AppInsights", and "CustomKeys". Default value is None. - :paramtype connection_type: str or ~azure.ai.projects.models.ConnectionType - :keyword default_connection: List connections that are default connections. Default value is - None. - :paramtype default_connection: bool - :return: An iterator like instance of Connection - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Connection] + :keyword model_publisher: Model publisher to filter models by. Default value is None. + :paramtype model_publisher: str + :keyword model_name: Model name (the publisher specific name) to filter models by. Default + value is None. + :paramtype model_name: str + :keyword deployment_type: Type of deployment to filter list by. "ModelDeployment" Default value + is None. + :paramtype deployment_type: str or ~azure.ai.projects.models.DeploymentType + :return: An iterator like instance of Deployment + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Deployment] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -254,9 +5506,10 @@ def list( def prepare_request(next_link=None): if not next_link: - _request = build_connections_list_request( - connection_type=connection_type, - default_connection=default_connection, + _request = build_deployments_list_request( + model_publisher=model_publisher, + model_name=model_name, + deployment_type=deployment_type, api_version=self._config.api_version, headers=_headers, params=_params, @@ -292,7 +5545,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -315,14 +5568,14 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) -class EvaluationsOperations: +class RedTeamsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`evaluations` attribute. + :attr:`red_teams` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -336,15 +5589,15 @@ def __init__(self, *args, **kwargs) -> None: @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - async def get(self, name: str, **kwargs: Any) -> _models.Evaluation: - """Get an evaluation run by name. + async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: + """Get a redteam by name. - :param name: Identifier of the evaluation. Required. + :param name: Identifier of the red team run. Required. :type name: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -358,9 +5611,9 @@ async def get(self, name: str, **kwargs: Any) -> _models.Evaluation: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) - _request = build_evaluations_get_request( + _request = build_red_teams_get_request( name=name, api_version=self._config.api_version, headers=_headers, @@ -395,7 +5648,7 @@ async def get(self, name: str, **kwargs: Any) -> _models.Evaluation: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Evaluation, response.json()) + deserialized = _deserialize(_models.RedTeam, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -406,19 +5659,19 @@ async def get(self, name: str, **kwargs: Any) -> _models.Evaluation: @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Evaluation"]: - """List evaluation runs. + def list(self, **kwargs: Any) -> AsyncItemPaged["_models.RedTeam"]: + """List a redteam by name. - :return: An iterator like instance of Evaluation - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Evaluation] + :return: An iterator like instance of RedTeam + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.RedTeam] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Evaluation]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -431,7 +5684,7 @@ def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Evaluation"]: def prepare_request(next_link=None): if not next_link: - _request = build_evaluations_list_request( + _request = build_red_teams_list_request( api_version=self._config.api_version, headers=_headers, params=_params, @@ -467,7 +5720,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Evaluation], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -491,49 +5744,47 @@ async def get_next(next_link=None): @overload async def create( - self, evaluation: _models.Evaluation, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: - """Creates an evaluation run. + self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: ~azure.ai.projects.models.Evaluation + :param red_team: Redteam to be run. Required. + :type red_team: ~azure.ai.projects.models.RedTeam :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create( - self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: - """Creates an evaluation run. + async def create(self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: JSON + :param red_team: Redteam to be run. Required. + :type red_team: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @overload async def create( - self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: - """Creates an evaluation run. + self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: IO[bytes] + :param red_team: Redteam to be run. Required. + :type red_team: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @@ -541,16 +5792,16 @@ async def create( @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - async def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwargs: Any) -> _models.Evaluation: - """Creates an evaluation run. + async def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Is one of the following types: Evaluation, JSON, - IO[bytes] Required. - :type evaluation: ~azure.ai.projects.models.Evaluation or JSON or IO[bytes] - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + Required. + :type red_team: ~azure.ai.projects.models.RedTeam or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -565,16 +5816,16 @@ async def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], * _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(evaluation, (IOBase, bytes)): - _content = evaluation + if isinstance(red_team, (IOBase, bytes)): + _content = red_team else: - _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_evaluations_create_request( + _request = build_red_teams_create_request( content_type=content_type, api_version=self._config.api_version, content=_content, @@ -605,77 +5856,44 @@ async def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], * if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Evaluation, response.json()) + deserialized = _deserialize(_models.RedTeam, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore - @overload - async def create_agent_evaluation( - self, evaluation: _models.AgentEvaluationRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. - - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: ~azure.ai.projects.models.AgentEvaluationRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create_agent_evaluation( - self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ +class EvaluationRulesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - @overload - async def create_agent_evaluation( - self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`evaluation_rules` attribute. + """ - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace_async @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - async def create_agent_evaluation( - self, evaluation: Union[_models.AgentEvaluationRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. + async def get(self, id: str, **kwargs: Any) -> _models.EvaluationRule: + """Get an evaluation rule. - :param evaluation: Agent evaluation to be run. Is one of the following types: - AgentEvaluationRequest, JSON, IO[bytes] Required. - :type evaluation: ~azure.ai.projects.models.AgentEvaluationRequest or JSON or IO[bytes] - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -686,23 +5904,14 @@ async def create_agent_evaluation( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.AgentEvaluation] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(evaluation, (IOBase, bytes)): - _content = evaluation - else: - _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[_models.EvaluationRule] = kwargs.pop("cls", None) - _request = build_evaluations_create_agent_evaluation_request( - content_type=content_type, + _request = build_evaluation_rules_get_request( + id=id, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -718,7 +5927,7 @@ async def create_agent_evaluation( response = pipeline_response.http_response - if response.status_code not in [201]: + if response.status_code not in [200]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -727,27 +5936,32 @@ async def create_agent_evaluation( map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.AgentEvaluation, response.json()) + deserialized = _deserialize(_models.EvaluationRule, response.json()) if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore + return cls(pipeline_response, deserialized, response_headers) # type: ignore return deserialized # type: ignore @distributed_trace_async @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], ) - async def cancel(self, name: str, **kwargs: Any) -> None: - """Cancel an evaluation run by name. + async def delete(self, id: str, **kwargs: Any) -> None: + """Delete an evaluation rule. - :param name: Identifier of the evaluation. Required. - :type name: str + :param id: Unique identifier for the evaluation rule. Required. + :type id: str :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: @@ -765,8 +5979,8 @@ async def cancel(self, name: str, **kwargs: Any) -> None: cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_evaluations_cancel_request( - name=name, + _request = build_evaluation_rules_delete_request( + id=id, api_version=self._config.api_version, headers=_headers, params=_params, @@ -795,19 +6009,78 @@ async def cancel(self, name: str, **kwargs: Any) -> None: if cls: return cls(pipeline_response, None, response_headers) # type: ignore + @overload + async def create_or_update( + self, id: str, evaluation_rule: _models.EvaluationRule, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: ~azure.ai.projects.models.EvaluationRule + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, id: str, evaluation_rule: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_or_update( + self, id: str, evaluation_rule: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + @distributed_trace_async @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - async def delete(self, name: str, **kwargs: Any) -> None: - """Delete an evaluation run by name. - - :param name: Identifier of the evaluation. Required. - :type name: str - :return: None - :rtype: None + async def create_or_update( + self, id: str, evaluation_rule: Union[_models.EvaluationRule, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Is one of the following types: + EvaluationRule, JSON, IO[bytes] Required. + :type evaluation_rule: ~azure.ai.projects.models.EvaluationRule or JSON or IO[bytes] + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -818,14 +6091,24 @@ async def delete(self, name: str, **kwargs: Any) -> None: } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = kwargs.pop("headers", {}) or {} + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} - cls: ClsType[None] = kwargs.pop("cls", None) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.EvaluationRule] = kwargs.pop("cls", None) - _request = build_evaluations_delete_request( - name=name, + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation_rule, (IOBase, bytes)): + _content = evaluation_rule + else: + _content = json.dumps(evaluation_rule, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_rules_create_or_update_request( + id=id, + content_type=content_type, api_version=self._config.api_version, + content=_content, headers=_headers, params=_params, ) @@ -834,57 +6117,65 @@ async def delete(self, name: str, **kwargs: Any) -> None: } _request.url = self._client.format_url(_request.url, **path_format_arguments) - _stream = False + _stream = kwargs.pop("stream", False) pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access _request, stream=_stream, **kwargs ) response = pipeline_response.http_response - if response.status_code not in [204]: + if response.status_code not in [200, 201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluationRule, response.json()) if cls: - return cls(pipeline_response, None, response_headers) # type: ignore - - -class DatasetsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`datasets` attribute. - """ + return cls(pipeline_response, deserialized, {}) # type: ignore - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + return deserialized # type: ignore @distributed_trace - def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.DatasetVersion"]: - """List all versions of the given DatasetVersion. - - :param name: The name of the resource. Required. - :type name: str - :return: An iterator like instance of DatasetVersion - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.DatasetVersion] + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "action_type", "agent_name", "enabled", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, + *, + action_type: Optional[Union[str, _models.EvaluationRuleActionType]] = None, + agent_name: Optional[str] = None, + enabled: Optional[bool] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.EvaluationRule"]: + """List all evaluation rules. + + :keyword action_type: Filter by the type of evaluation rule. Known values are: + "continuousEvaluation" and "humanEvaluation". Default value is None. + :paramtype action_type: str or ~azure.ai.projects.models.EvaluationRuleActionType + :keyword agent_name: Filter by the agent name. Default value is None. + :paramtype agent_name: str + :keyword enabled: Filter by the enabled status. Default value is None. + :paramtype enabled: bool + :return: An iterator like instance of EvaluationRule + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.EvaluationRule] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationRule]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -897,8 +6188,10 @@ def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.Dat def prepare_request(next_link=None): if not next_link: - _request = build_datasets_list_versions_request( - name=name, + _request = build_evaluation_rules_list_request( + action_type=action_type, + agent_name=agent_name, + enabled=enabled, api_version=self._config.api_version, headers=_headers, params=_params, @@ -934,7 +6227,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationRule], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -956,18 +6249,119 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) - @distributed_trace - def list(self, **kwargs: Any) -> AsyncItemPaged["_models.DatasetVersion"]: - """List the latest version of each DatasetVersion. - :return: An iterator like instance of DatasetVersion - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.DatasetVersion] +class EvaluationTaxonomiesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`evaluation_taxonomies` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get(self, name: str, **kwargs: Any) -> _models.EvaluationTaxonomy: + """Get an evaluation run by name. + + :param name: The name of the resource. Required. + :type name: str + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) + + _request = build_evaluation_taxonomies_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "input_name", "input_type", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, *, input_name: Optional[str] = None, input_type: Optional[str] = None, **kwargs: Any + ) -> AsyncItemPaged["_models.EvaluationTaxonomy"]: + """List evaluation taxonomies. + + :keyword input_name: Filter by the evaluation input name. Default value is None. + :paramtype input_name: str + :keyword input_type: Filter by taxonomy input type. Default value is None. + :paramtype input_type: str + :return: An iterator like instance of EvaluationTaxonomy + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.EvaluationTaxonomy] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.EvaluationTaxonomy]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -980,7 +6374,9 @@ def list(self, **kwargs: Any) -> AsyncItemPaged["_models.DatasetVersion"]: def prepare_request(next_link=None): if not next_link: - _request = build_datasets_list_request( + _request = build_evaluation_taxonomies_list_request( + input_name=input_name, + input_type=input_type, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1016,7 +6412,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationTaxonomy], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -1034,83 +6430,21 @@ async def get_next(next_link=None): map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - return pipeline_response - - return AsyncItemPaged(get_next, extract_data) - - @distributed_trace_async - async def get(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: - """Get the specific version of the DatasetVersion. The service returns 404 Not Found error if the - DatasetVersion does not exist. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to retrieve. Required. - :type version: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - _request = build_datasets_get_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) @distributed_trace_async - async def delete(self, name: str, version: str, **kwargs: Any) -> None: - """Delete the specific version of the DatasetVersion. The service returns 204 No Content if the - DatasetVersion was deleted successfully or if the DatasetVersion does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete(self, name: str, **kwargs: Any) -> None: + """Delete an evaluation taxonomy by name. :param name: The name of the resource. Required. :type name: str - :param version: The version of the DatasetVersion to delete. Required. - :type version: str :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: @@ -1128,9 +6462,8 @@ async def delete(self, name: str, version: str, **kwargs: Any) -> None: cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_datasets_delete_request( + _request = build_evaluation_taxonomies_delete_request( name=name, - version=version, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1151,102 +6484,86 @@ async def delete(self, name: str, version: str, **kwargs: Any) -> None: map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + if cls: - return cls(pipeline_response, None, {}) # type: ignore + return cls(pipeline_response, None, response_headers) # type: ignore @overload - async def create_or_update( - self, - name: str, - version: str, - dataset_version: _models.DatasetVersion, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + async def create( + self, name: str, body: _models.EvaluationTaxonomy, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: ~azure.ai.projects.models.DatasetVersion + :param body: The evaluation taxonomy. Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create_or_update( - self, - name: str, - version: str, - dataset_version: JSON, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + async def create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: JSON + :param body: The evaluation taxonomy. Required. + :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create_or_update( - self, - name: str, - version: str, - dataset_version: IO[bytes], - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + async def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: IO[bytes] + :param body: The evaluation taxonomy. Required. + :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace_async - async def create_or_update( - self, name: str, version: str, dataset_version: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create( + self, name: str, body: Union[_models.EvaluationTaxonomy, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type dataset_version: ~azure.ai.projects.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :param body: The evaluation taxonomy. Is one of the following types: EvaluationTaxonomy, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy or JSON or IO[bytes] + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1261,18 +6578,17 @@ async def create_or_update( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) - content_type = content_type or "application/merge-patch+json" + content_type = content_type or "application/json" _content = None - if isinstance(dataset_version, (IOBase, bytes)): - _content = dataset_version + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(dataset_version, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_create_or_update_request( + _request = build_evaluation_taxonomies_create_request( name=name, - version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1291,7 +6607,7 @@ async def create_or_update( response = pipeline_response.http_response - if response.status_code not in [200, 201]: + if response.status_code not in [201]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -1303,7 +6619,7 @@ async def create_or_update( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -1311,103 +6627,77 @@ async def create_or_update( return deserialized # type: ignore @overload - async def pending_upload( - self, - name: str, - version: str, - pending_upload_request: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + async def update( + self, name: str, body: _models.EvaluationTaxonomy, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest + :param body: The evaluation taxonomy. Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def pending_upload( - self, - name: str, - version: str, - pending_upload_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + async def update( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: JSON + :param body: The evaluation taxonomy. Required. + :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def pending_upload( - self, - name: str, - version: str, - pending_upload_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + async def update( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: IO[bytes] + :param body: The evaluation taxonomy. Required. + :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace_async - async def pending_upload( - self, - name: str, - version: str, - pending_upload_request: Union[_models.PendingUploadRequest, JSON, IO[bytes]], - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def update( + self, name: str, body: Union[_models.EvaluationTaxonomy, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Is one of the following - types: PendingUploadRequest, JSON, IO[bytes] Required. - :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest or JSON or - IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :param body: The evaluation taxonomy. Is one of the following types: EvaluationTaxonomy, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy or JSON or IO[bytes] + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1422,18 +6712,17 @@ async def pending_upload( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(pending_upload_request, (IOBase, bytes)): - _content = pending_upload_request + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(pending_upload_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_pending_upload_request( + _request = build_evaluation_taxonomies_update_request( name=name, - version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1464,70 +6753,7 @@ async def pending_upload( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @distributed_trace_async - async def get_credentials(self, name: str, version: str, **kwargs: Any) -> _models.DatasetCredential: - """Get the SAS credential to access the storage account associated with a Dataset version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :return: DatasetCredential. The DatasetCredential is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetCredential - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.DatasetCredential] = kwargs.pop("cls", None) - - _request = build_datasets_get_credentials_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetCredential, response.json()) + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -1535,14 +6761,14 @@ async def get_credentials(self, name: str, version: str, **kwargs: Any) -> _mode return deserialized # type: ignore -class IndexesOperations: +class EvaluatorsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`indexes` attribute. + :attr:`evaluators` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -1553,19 +6779,38 @@ def __init__(self, *args, **kwargs) -> None: self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.Index"]: - """List all versions of the given Index. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "type", "limit", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_versions( + self, + name: str, + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.EvaluatorVersion"]: + """List all versions of the given evaluator. :param name: The name of the resource. Required. :type name: str - :return: An iterator like instance of Index - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Index] + :keyword type: Filter evaluators by type. Possible values: 'all', 'custom', 'builtin'. Is one + of the following types: Literal["builtin"], Literal["custom"], Literal["all"], str Default + value is None. + :paramtype type: str or str or str or str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the default is 20. Default value is None. + :paramtype limit: int + :return: An iterator like instance of EvaluatorVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.EvaluatorVersion] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluatorVersion]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1578,8 +6823,10 @@ def list_versions(self, name: str, **kwargs: Any) -> AsyncItemPaged["_models.Ind def prepare_request(next_link=None): if not next_link: - _request = build_indexes_list_versions_request( + _request = build_evaluators_list_versions_request( name=name, + type=type, + limit=limit, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1615,7 +6862,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluatorVersion], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -1638,17 +6885,35 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) @distributed_trace - def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Index"]: - """List the latest version of each Index. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "type", "limit", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_latest_versions( + self, + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any + ) -> AsyncItemPaged["_models.EvaluatorVersion"]: + """List the latest version of each evaluator. - :return: An iterator like instance of Index - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Index] + :keyword type: Filter evaluators by type. Possible values: 'all', 'custom', 'builtin'. Is one + of the following types: Literal["builtin"], Literal["custom"], Literal["all"], str Default + value is None. + :paramtype type: str or str or str or str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the default is 20. Default value is None. + :paramtype limit: int + :return: An iterator like instance of EvaluatorVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.EvaluatorVersion] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluatorVersion]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1661,7 +6926,9 @@ def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Index"]: def prepare_request(next_link=None): if not next_link: - _request = build_indexes_list_request( + _request = build_evaluators_list_latest_versions_request( + type=type, + limit=limit, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1697,7 +6964,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluatorVersion], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -1720,16 +6987,21 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) @distributed_trace_async - async def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: - """Get the specific version of the Index. The service returns 404 Not Found error if the Index - does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Get the specific version of the EvaluatorVersion. The service returns 404 Not Found error if + the EvaluatorVersion does not exist. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to retrieve. Required. + :param version: The specific version id of the EvaluatorVersion to retrieve. Required. :type version: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1743,9 +7015,9 @@ async def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Index] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - _request = build_indexes_get_request( + _request = build_evaluators_get_version_request( name=name, version=version, api_version=self._config.api_version, @@ -1776,7 +7048,7 @@ async def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Index, response.json()) + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -1784,13 +7056,18 @@ async def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: return deserialized # type: ignore @distributed_trace_async - async def delete(self, name: str, version: str, **kwargs: Any) -> None: - """Delete the specific version of the Index. The service returns 204 No Content if the Index was - deleted successfully or if the Index does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the EvaluatorVersion. The service returns 204 No Content if the + EvaluatorVersion was deleted successfully or if the EvaluatorVersion does not exist. :param name: The name of the resource. Required. :type name: str - :param version: The version of the Index to delete. Required. + :param version: The version of the EvaluatorVersion to delete. Required. :type version: str :return: None :rtype: None @@ -1809,7 +7086,7 @@ async def delete(self, name: str, version: str, **kwargs: Any) -> None: cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_indexes_delete_request( + _request = build_evaluators_delete_version_request( name=name, version=version, api_version=self._config.api_version, @@ -1835,93 +7112,86 @@ async def delete(self, name: str, version: str, **kwargs: Any) -> None: if cls: return cls(pipeline_response, None, {}) # type: ignore - @overload - async def create_or_update( - self, - name: str, - version: str, - index: _models.Index, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def create_version(self, name: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Create a new EvaluatorVersion with auto incremented version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: ~azure.ai.projects.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) - @overload - async def create_or_update( - self, name: str, version: str, index: JSON, *, content_type: str = "application/merge-patch+json", **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - @overload - async def create_or_update( - self, - name: str, - version: str, - index: IO[bytes], - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + _request = build_evaluators_create_version_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore @distributed_trace_async - async def create_or_update( - self, name: str, version: str, index: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def update_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Update an existing EvaluatorVersion with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to create or update. Required. + :param version: The version of the EvaluatorVersion to update. Required. :type version: str - :param index: The Index to create or update. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type index: ~azure.ai.projects.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1932,25 +7202,15 @@ async def create_or_update( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/merge-patch+json" - _content = None - if isinstance(index, (IOBase, bytes)): - _content = index - else: - _content = json.dumps(index, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - _request = build_indexes_create_or_update_request( + _request = build_evaluators_update_version_request( name=name, version=version, - content_type=content_type, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -1966,7 +7226,7 @@ async def create_or_update( response = pipeline_response.http_response - if response.status_code not in [200, 201]: + if response.status_code not in [200]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -1978,7 +7238,7 @@ async def create_or_update( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Index, response.json()) + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -1986,14 +7246,14 @@ async def create_or_update( return deserialized # type: ignore -class DeploymentsOperations: +class InsightsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`deployments` attribute. + :attr:`insights` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -2003,14 +7263,158 @@ def __init__(self, *args, **kwargs) -> None: self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + @overload + async def generate( + self, insight: _models.Insight, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: ~azure.ai.projects.models.Insight + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def generate( + self, insight: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def generate( + self, insight: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + @distributed_trace_async - async def get(self, name: str, **kwargs: Any) -> _models.Deployment: - """Get a deployed model. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "repeatability_request_id", + "repeatability_first_sent", + "content_type", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) + async def generate(self, insight: Union[_models.Insight, JSON, IO[bytes]], **kwargs: Any) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Is one of the following types: Insight, JSON, IO[bytes] Required. + :type insight: ~azure.ai.projects.models.Insight or JSON or IO[bytes] + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Insight] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(insight, (IOBase, bytes)): + _content = insight + else: + _content = json.dumps(insight, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_insights_generate_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Insight, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore - :param name: Name of the deployment. Required. - :type name: str - :return: Deployment. The Deployment is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Deployment + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "id", "include_coordinates", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + async def get(self, id: str, *, include_coordinates: Optional[bool] = None, **kwargs: Any) -> _models.Insight: + """Get a specific insight by Id. + + :param id: The unique identifier for the insights report. Required. + :type id: str + :keyword include_coordinates: Whether to include coordinates for visualization in the response. + Defaults to false. Default value is None. + :paramtype include_coordinates: bool + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2024,10 +7428,11 @@ async def get(self, name: str, **kwargs: Any) -> _models.Deployment: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) + cls: ClsType[_models.Insight] = kwargs.pop("cls", None) - _request = build_deployments_get_request( - name=name, + _request = build_insights_get_request( + id=id, + include_coordinates=include_coordinates, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2061,7 +7466,7 @@ async def get(self, name: str, **kwargs: Any) -> _models.Deployment: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Deployment, response.json()) + deserialized = _deserialize(_models.Insight, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -2069,32 +7474,54 @@ async def get(self, name: str, **kwargs: Any) -> _models.Deployment: return deserialized # type: ignore @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "type", + "eval_id", + "run_id", + "agent_name", + "include_coordinates", + "client_request_id", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) def list( self, *, - model_publisher: Optional[str] = None, - model_name: Optional[str] = None, - deployment_type: Optional[Union[str, _models.DeploymentType]] = None, + type: Optional[Union[str, _models.InsightType]] = None, + eval_id: Optional[str] = None, + run_id: Optional[str] = None, + agent_name: Optional[str] = None, + include_coordinates: Optional[bool] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.Deployment"]: - """List all deployed models in the project. - - :keyword model_publisher: Model publisher to filter models by. Default value is None. - :paramtype model_publisher: str - :keyword model_name: Model name (the publisher specific name) to filter models by. Default - value is None. - :paramtype model_name: str - :keyword deployment_type: Type of deployment to filter list by. "ModelDeployment" Default value - is None. - :paramtype deployment_type: str or ~azure.ai.projects.models.DeploymentType - :return: An iterator like instance of Deployment - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Deployment] + ) -> AsyncItemPaged["_models.Insight"]: + """List all insights in reverse chronological order (newest first). + + :keyword type: Filter by the type of analysis. Known values are: "EvaluationRunClusterInsight", + "AgentClusterInsight", and "EvaluationComparison". Default value is None. + :paramtype type: str or ~azure.ai.projects.models.InsightType + :keyword eval_id: Filter by the evaluation ID. Default value is None. + :paramtype eval_id: str + :keyword run_id: Filter by the evaluation run ID. Default value is None. + :paramtype run_id: str + :keyword agent_name: Filter by the agent name. Default value is None. + :paramtype agent_name: str + :keyword include_coordinates: Whether to include coordinates for visualization in the response. + Defaults to false. Default value is None. + :paramtype include_coordinates: bool + :return: An iterator like instance of Insight + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Insight] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Insight]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2107,10 +7534,12 @@ def list( def prepare_request(next_link=None): if not next_link: - _request = build_deployments_list_request( - model_publisher=model_publisher, - model_name=model_name, - deployment_type=deployment_type, + _request = build_insights_list_request( + type=type, + eval_id=eval_id, + run_id=run_id, + agent_name=agent_name, + include_coordinates=include_coordinates, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2146,7 +7575,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Insight], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -2169,14 +7598,14 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) -class RedTeamsOperations: +class SchedulesOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.aio.AIProjectClient`'s - :attr:`red_teams` attribute. + :attr:`schedules` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -2188,17 +7617,17 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace_async @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], ) - async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: - """Get a redteam by name. + async def delete(self, id: str, **kwargs: Any) -> None: + """Delete a schedule. - :param name: Identifier of the red team run. Required. - :type name: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :param id: Identifier of the schedule. Required. + :type id: str + :return: None + :rtype: None :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2212,10 +7641,68 @@ async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_red_teams_get_request( - name=name, + _request = build_schedules_delete_request( + id=id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if cls: + return cls(pipeline_response, None, response_headers) # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get(self, id: str, **kwargs: Any) -> _models.Schedule: + """Get a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Schedule] = kwargs.pop("cls", None) + + _request = build_schedules_get_request( + id=id, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2249,7 +7736,7 @@ async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.RedTeam, response.json()) + deserialized = _deserialize(_models.Schedule, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -2258,21 +7745,21 @@ async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - def list(self, **kwargs: Any) -> AsyncItemPaged["_models.RedTeam"]: - """List a redteam by name. + def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Schedule"]: + """List all schedules. - :return: An iterator like instance of RedTeam - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.RedTeam] + :return: An iterator like instance of Schedule + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.models.Schedule] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Schedule]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2285,7 +7772,7 @@ def list(self, **kwargs: Any) -> AsyncItemPaged["_models.RedTeam"]: def prepare_request(next_link=None): if not next_link: - _request = build_red_teams_list_request( + _request = build_schedules_list_request( api_version=self._config.api_version, headers=_headers, params=_params, @@ -2321,7 +7808,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Schedule], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -2344,65 +7831,77 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) @overload - async def create( - self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: ~azure.ai.projects.models.RedTeam + async def create_or_update( + self, id: str, schedule: _models.Schedule, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: ~azure.ai.projects.models.Schedule :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create(self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: JSON + async def create_or_update( + self, id: str, schedule: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create( - self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: IO[bytes] + async def create_or_update( + self, id: str, schedule: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace_async @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - async def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: - """Creates a redteam run. + async def create_or_update( + self, id: str, schedule: Union[_models.Schedule, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. - :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Is one of the following types: Schedule, JSON, IO[bytes] Required. - :type red_team: ~azure.ai.projects.models.RedTeam or JSON or IO[bytes] - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :type schedule: ~azure.ai.projects.models.Schedule or JSON or IO[bytes] + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2417,16 +7916,17 @@ async def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwar _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + cls: ClsType[_models.Schedule] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(red_team, (IOBase, bytes)): - _content = red_team + if isinstance(schedule, (IOBase, bytes)): + _content = schedule else: - _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(schedule, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_red_teams_create_request( + _request = build_schedules_create_or_update_request( + id=id, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -2445,7 +7945,7 @@ async def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwar response = pipeline_response.http_response - if response.status_code not in [201]: + if response.status_code not in [200, 201]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -2457,7 +7957,140 @@ async def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwar if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.RedTeam, response.json()) + deserialized = _deserialize(_models.Schedule, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "schedule_id", "run_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def get_run(self, schedule_id: str, run_id: str, **kwargs: Any) -> _models.ScheduleRun: + """Get a schedule run by id. + + :param schedule_id: Identifier of the schedule. Required. + :type schedule_id: str + :param run_id: Identifier of the schedule run. Required. + :type run_id: str + :return: ScheduleRun. The ScheduleRun is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.ScheduleRun + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.ScheduleRun] = kwargs.pop("cls", None) + + _request = build_schedules_get_run_request( + schedule_id=schedule_id, + run_id=run_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.ScheduleRun, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "schedule_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + async def list_runs(self, schedule_id: str, **kwargs: Any) -> _models.PagedScheduleRun: + """List all schedule runs. + + :param schedule_id: Identifier of the schedule. Required. + :type schedule_id: str + :return: PagedScheduleRun. The PagedScheduleRun is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PagedScheduleRun + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.PagedScheduleRun] = kwargs.pop("cls", None) + + _request = build_schedules_list_runs_request( + schedule_id=schedule_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PagedScheduleRun, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/models/__init__.py b/sdk/ai/azure-ai-projects/azure/ai/projects/models/__init__.py index 4bd6b711325b..f65ea1133818 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/models/__init__.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/models/__init__.py @@ -14,119 +14,807 @@ from ._models import ( # type: ignore - AgentEvaluation, - AgentEvaluationRedactionConfiguration, - AgentEvaluationRequest, - AgentEvaluationResult, - AgentEvaluationSamplingConfiguration, + A2ATool, + AISearchIndexResource, + AgentClusterInsightResult, + AgentClusterInsightsRequest, + AgentContainerObject, + AgentContainerOperationError, + AgentContainerOperationObject, + AgentDefinition, + AgentId, + AgentObject, + AgentObjectVersions, + AgentReference, + AgentTaxonomyInput, + AgentVersionObject, + AgenticIdentityCredentials, + Annotation, + AnnotationFileCitation, + AnnotationFilePath, + AnnotationUrlCitation, + ApiError, + ApiErrorResponse, + ApiInnerError, ApiKeyCredentials, - AssistantMessage, + ApproximateLocation, + AzureAIAgentTarget, + AzureAISearchAgentTool, AzureAISearchIndex, + AzureAISearchToolResource, + AzureFunctionAgentTool, + AzureFunctionBinding, + AzureFunctionDefinition, + AzureFunctionDefinitionFunction, + AzureFunctionStorageQueue, AzureOpenAIModelConfiguration, BaseCredentials, + BingCustomSearchAgentTool, + BingCustomSearchConfiguration, + BingCustomSearchToolParameters, + BingGroundingAgentTool, + BingGroundingSearchConfiguration, + BingGroundingSearchToolParameters, BlobReference, BlobReferenceSasCredential, + BrowserAutomationAgentTool, + BrowserAutomationToolConnectionParameters, + BrowserAutomationToolParameters, + CaptureStructuredOutputsTool, + ChartCoordinate, + ChatSummaryMemoryItem, + ClusterInsightResult, + ClusterTokenUsage, + CodeBasedEvaluatorDefinition, + CodeInterpreterOutput, + CodeInterpreterOutputImage, + CodeInterpreterOutputLogs, + CodeInterpreterTool, + CodeInterpreterToolAuto, + CodeInterpreterToolCallItemParam, + CodeInterpreterToolCallItemResource, + ComparisonFilter, + CompoundFilter, + ComputerAction, + ComputerActionClick, + ComputerActionDoubleClick, + ComputerActionDrag, + ComputerActionKeyPress, + ComputerActionMove, + ComputerActionScreenshot, + ComputerActionScroll, + ComputerActionTypeKeys, + ComputerActionWait, + ComputerToolCallItemParam, + ComputerToolCallItemResource, + ComputerToolCallOutputItemOutput, + ComputerToolCallOutputItemOutputComputerScreenshot, + ComputerToolCallOutputItemParam, + ComputerToolCallOutputItemResource, + ComputerToolCallSafetyCheck, + ComputerUsePreviewTool, Connection, + ContainerAppAgentDefinition, + ContinuousEvaluationRuleAction, + Coordinate, CosmosDBIndex, + CreatedBy, + CronTrigger, CustomCredential, + DailyRecurrenceSchedule, DatasetCredential, DatasetVersion, + DeleteAgentResponse, + DeleteAgentVersionResponse, + DeleteMemoryStoreResponse, Deployment, - DeveloperMessage, EmbeddingConfiguration, EntraIDCredentials, - Evaluation, - EvaluationTarget, - EvaluatorConfiguration, + EvalCompareReport, + EvalResult, + EvalRunResultCompareItem, + EvalRunResultComparison, + EvalRunResultSummary, + EvaluationComparisonRequest, + EvaluationResultSample, + EvaluationRule, + EvaluationRuleAction, + EvaluationRuleFilter, + EvaluationRunClusterInsightResult, + EvaluationRunClusterInsightsRequest, + EvaluationScheduleTask, + EvaluationTaxonomy, + EvaluationTaxonomyInput, + EvaluatorDefinition, + EvaluatorMetric, + EvaluatorVersion, + FabricDataAgentToolParameters, FieldMapping, FileDatasetVersion, + FileSearchTool, + FileSearchToolCallItemParam, + FileSearchToolCallItemParamResult, + FileSearchToolCallItemResource, FolderDatasetVersion, + FunctionTool, + FunctionToolCallItemParam, + FunctionToolCallItemResource, + FunctionToolCallOutputItemParam, + FunctionToolCallOutputItemResource, + HostedAgentDefinition, + HourlyRecurrenceSchedule, + HumanEvaluationRuleAction, + ImageBasedHostedAgentDefinition, + ImageGenTool, + ImageGenToolCallItemParam, + ImageGenToolCallItemResource, + ImageGenToolInputImageMask, Index, - InputData, - InputDataset, + Insight, + InsightCluster, + InsightModelConfiguration, + InsightRequest, + InsightResult, + InsightSample, + InsightScheduleTask, + InsightSummary, + InsightsMetadata, + InvokeAzureAgentWorkflowActionOutputItemResource, + ItemContent, + ItemContentInputAudio, + ItemContentInputFile, + ItemContentInputImage, + ItemContentInputText, + ItemContentOutputAudio, + ItemContentOutputText, + ItemContentRefusal, + ItemParam, + ItemReferenceItemParam, + ItemResource, + LocalShellExecAction, + LocalShellTool, + LocalShellToolCallItemParam, + LocalShellToolCallItemResource, + LocalShellToolCallOutputItemParam, + LocalShellToolCallOutputItemResource, + Location, + LogProb, + MCPApprovalRequestItemParam, + MCPApprovalRequestItemResource, + MCPApprovalResponseItemParam, + MCPApprovalResponseItemResource, + MCPCallItemParam, + MCPCallItemResource, + MCPListToolsItemParam, + MCPListToolsItemResource, + MCPListToolsTool, + MCPTool, + MCPToolAllowedTools1, + MCPToolRequireApproval1, + MCPToolRequireApprovalAlways, + MCPToolRequireApprovalNever, ManagedAzureAISearchIndex, - Message, + MemoryItem, + MemoryOperation, + MemorySearchItem, + MemorySearchOptions, + MemorySearchTool, + MemorySearchToolCallItemParam, + MemorySearchToolCallItemResource, + MemoryStoreDefaultDefinition, + MemoryStoreDefaultOptions, + MemoryStoreDefinition, + MemoryStoreDeleteScopeResponse, + MemoryStoreObject, + MemoryStoreOperationUsage, + MemoryStoreOperationUsageInputTokensDetails, + MemoryStoreOperationUsageOutputTokensDetails, + MemoryStoreSearchResponse, + MemoryStoreUpdateResponse, + MemoryStoreUpdateResult, + MicrosoftFabricAgentTool, ModelDeployment, ModelDeploymentSku, - ModelResponseGenerationTarget, + MonthlyRecurrenceSchedule, NoAuthenticationCredentials, + OAuthConsentRequestItemResource, + OneTimeTrigger, + OpenApiAgentTool, + OpenApiAnonymousAuthDetails, + OpenApiAuthDetails, + OpenApiFunctionDefinition, + OpenApiFunctionDefinitionFunction, + OpenApiManagedAuthDetails, + OpenApiManagedSecurityScheme, + OpenApiProjectConnectionAuthDetails, + OpenApiProjectConnectionSecurityScheme, + PagedScheduleRun, PendingUploadRequest, PendingUploadResponse, + Prompt, + PromptAgentDefinition, + PromptAgentDefinitionText, + PromptBasedEvaluatorDefinition, + ProtocolVersionRecord, + RaiConfig, + RankingOptions, + Reasoning, + ReasoningItemParam, + ReasoningItemResource, + ReasoningItemSummaryPart, + ReasoningItemSummaryTextPart, + RecurrenceSchedule, + RecurrenceTrigger, RedTeam, + Response, + ResponseCodeInterpreterCallCodeDeltaEvent, + ResponseCodeInterpreterCallCodeDoneEvent, + ResponseCodeInterpreterCallCompletedEvent, + ResponseCodeInterpreterCallInProgressEvent, + ResponseCodeInterpreterCallInterpretingEvent, + ResponseCompletedEvent, + ResponseContentPartAddedEvent, + ResponseContentPartDoneEvent, + ResponseConversation1, + ResponseCreatedEvent, + ResponseError, + ResponseErrorEvent, + ResponseFailedEvent, + ResponseFileSearchCallCompletedEvent, + ResponseFileSearchCallInProgressEvent, + ResponseFileSearchCallSearchingEvent, + ResponseFormatJsonSchemaSchema, + ResponseFunctionCallArgumentsDeltaEvent, + ResponseFunctionCallArgumentsDoneEvent, + ResponseImageGenCallCompletedEvent, + ResponseImageGenCallGeneratingEvent, + ResponseImageGenCallInProgressEvent, + ResponseImageGenCallPartialImageEvent, + ResponseInProgressEvent, + ResponseIncompleteDetails1, + ResponseIncompleteEvent, + ResponseMCPCallArgumentsDeltaEvent, + ResponseMCPCallArgumentsDoneEvent, + ResponseMCPCallCompletedEvent, + ResponseMCPCallFailedEvent, + ResponseMCPCallInProgressEvent, + ResponseMCPListToolsCompletedEvent, + ResponseMCPListToolsFailedEvent, + ResponseMCPListToolsInProgressEvent, + ResponseOutputItemAddedEvent, + ResponseOutputItemDoneEvent, + ResponsePromptVariables, + ResponseQueuedEvent, + ResponseReasoningDeltaEvent, + ResponseReasoningDoneEvent, + ResponseReasoningSummaryDeltaEvent, + ResponseReasoningSummaryDoneEvent, + ResponseReasoningSummaryPartAddedEvent, + ResponseReasoningSummaryPartDoneEvent, + ResponseReasoningSummaryTextDeltaEvent, + ResponseReasoningSummaryTextDoneEvent, + ResponseRefusalDeltaEvent, + ResponseRefusalDoneEvent, + ResponseStreamEvent, + ResponseText, + ResponseTextDeltaEvent, + ResponseTextDoneEvent, + ResponseTextFormatConfiguration, + ResponseTextFormatConfigurationJsonObject, + ResponseTextFormatConfigurationJsonSchema, + ResponseTextFormatConfigurationText, + ResponseUsage, + ResponseWebSearchCallCompletedEvent, + ResponseWebSearchCallInProgressEvent, + ResponseWebSearchCallSearchingEvent, + ResponsesAssistantMessageItemParam, + ResponsesAssistantMessageItemResource, + ResponsesDeveloperMessageItemParam, + ResponsesDeveloperMessageItemResource, + ResponsesMessageItemParam, + ResponsesMessageItemResource, + ResponsesSystemMessageItemParam, + ResponsesSystemMessageItemResource, + ResponsesUserMessageItemParam, + ResponsesUserMessageItemResource, SASCredentials, - SystemMessage, + Schedule, + ScheduleRun, + ScheduleTask, + SharepointAgentTool, + SharepointGroundingToolParameters, + StructuredInputDefinition, + StructuredOutputDefinition, + StructuredOutputsItemResource, + Target, TargetConfig, - UserMessage, + TaxonomyCategory, + TaxonomySubCategory, + Tool, + ToolArgumentBinding, + ToolChoiceObject, + ToolChoiceObjectCodeInterpreter, + ToolChoiceObjectComputer, + ToolChoiceObjectFileSearch, + ToolChoiceObjectFunction, + ToolChoiceObjectImageGen, + ToolChoiceObjectMCP, + ToolChoiceObjectWebSearch, + ToolDescription, + ToolProjectConnection, + ToolProjectConnectionList, + TopLogProb, + Trigger, + UserProfileMemoryItem, + VectorStoreFileAttributes, + WebSearchAction, + WebSearchActionFind, + WebSearchActionOpenPage, + WebSearchActionSearch, + WebSearchPreviewTool, + WebSearchToolCallItemParam, + WebSearchToolCallItemResource, + WeeklyRecurrenceSchedule, + WorkflowActionOutputItemResource, + WorkflowDefinition, ) from ._enums import ( # type: ignore + AgentContainerOperationStatus, + AgentContainerStatus, + AgentKind, + AgentProtocol, + AnnotationType, AttackStrategy, + AzureAISearchQueryType, + CodeInterpreterOutputType, + ComputerActionType, + ComputerToolCallOutputItemOutputType, ConnectionType, CredentialType, DatasetType, + DayOfWeek, DeploymentType, - EvaluationTargetType, + EvaluationRuleActionType, + EvaluationRuleEventType, + EvaluationTaxonomyInputType, + EvaluatorCategory, + EvaluatorDefinitionType, + EvaluatorMetricDirection, + EvaluatorMetricType, + EvaluatorType, IndexType, + InsightType, + ItemContentType, + ItemType, + LocationType, + MemoryItemKind, + MemoryOperationKind, + MemoryStoreKind, + MemoryStoreUpdateStatus, + OpenApiAuthType, + OperationState, PendingUploadType, + ReasoningEffort, + ReasoningItemSummaryPartType, + RecurrenceType, + ResponseErrorCode, + ResponseStreamEventType, + ResponseTextFormatConfigurationType, + ResponsesMessageRole, RiskCategory, + SampleType, + ScheduleProvisioningStatus, + ScheduleTaskType, + ServiceTier, + ToolChoiceObjectType, + ToolChoiceOptions, + ToolType, + TreatmentEffectType, + TriggerType, + WebSearchActionType, ) from ._patch import __all__ as _patch_all from ._patch import * from ._patch import patch_sdk as _patch_sdk __all__ = [ - "AgentEvaluation", - "AgentEvaluationRedactionConfiguration", - "AgentEvaluationRequest", - "AgentEvaluationResult", - "AgentEvaluationSamplingConfiguration", + "A2ATool", + "AISearchIndexResource", + "AgentClusterInsightResult", + "AgentClusterInsightsRequest", + "AgentContainerObject", + "AgentContainerOperationError", + "AgentContainerOperationObject", + "AgentDefinition", + "AgentId", + "AgentObject", + "AgentObjectVersions", + "AgentReference", + "AgentTaxonomyInput", + "AgentVersionObject", + "AgenticIdentityCredentials", + "Annotation", + "AnnotationFileCitation", + "AnnotationFilePath", + "AnnotationUrlCitation", + "ApiError", + "ApiErrorResponse", + "ApiInnerError", "ApiKeyCredentials", - "AssistantMessage", + "ApproximateLocation", + "AzureAIAgentTarget", + "AzureAISearchAgentTool", "AzureAISearchIndex", + "AzureAISearchToolResource", + "AzureFunctionAgentTool", + "AzureFunctionBinding", + "AzureFunctionDefinition", + "AzureFunctionDefinitionFunction", + "AzureFunctionStorageQueue", "AzureOpenAIModelConfiguration", "BaseCredentials", + "BingCustomSearchAgentTool", + "BingCustomSearchConfiguration", + "BingCustomSearchToolParameters", + "BingGroundingAgentTool", + "BingGroundingSearchConfiguration", + "BingGroundingSearchToolParameters", "BlobReference", "BlobReferenceSasCredential", + "BrowserAutomationAgentTool", + "BrowserAutomationToolConnectionParameters", + "BrowserAutomationToolParameters", + "CaptureStructuredOutputsTool", + "ChartCoordinate", + "ChatSummaryMemoryItem", + "ClusterInsightResult", + "ClusterTokenUsage", + "CodeBasedEvaluatorDefinition", + "CodeInterpreterOutput", + "CodeInterpreterOutputImage", + "CodeInterpreterOutputLogs", + "CodeInterpreterTool", + "CodeInterpreterToolAuto", + "CodeInterpreterToolCallItemParam", + "CodeInterpreterToolCallItemResource", + "ComparisonFilter", + "CompoundFilter", + "ComputerAction", + "ComputerActionClick", + "ComputerActionDoubleClick", + "ComputerActionDrag", + "ComputerActionKeyPress", + "ComputerActionMove", + "ComputerActionScreenshot", + "ComputerActionScroll", + "ComputerActionTypeKeys", + "ComputerActionWait", + "ComputerToolCallItemParam", + "ComputerToolCallItemResource", + "ComputerToolCallOutputItemOutput", + "ComputerToolCallOutputItemOutputComputerScreenshot", + "ComputerToolCallOutputItemParam", + "ComputerToolCallOutputItemResource", + "ComputerToolCallSafetyCheck", + "ComputerUsePreviewTool", "Connection", + "ContainerAppAgentDefinition", + "ContinuousEvaluationRuleAction", + "Coordinate", "CosmosDBIndex", + "CreatedBy", + "CronTrigger", "CustomCredential", + "DailyRecurrenceSchedule", "DatasetCredential", "DatasetVersion", + "DeleteAgentResponse", + "DeleteAgentVersionResponse", + "DeleteMemoryStoreResponse", "Deployment", - "DeveloperMessage", "EmbeddingConfiguration", "EntraIDCredentials", - "Evaluation", - "EvaluationTarget", - "EvaluatorConfiguration", + "EvalCompareReport", + "EvalResult", + "EvalRunResultCompareItem", + "EvalRunResultComparison", + "EvalRunResultSummary", + "EvaluationComparisonRequest", + "EvaluationResultSample", + "EvaluationRule", + "EvaluationRuleAction", + "EvaluationRuleFilter", + "EvaluationRunClusterInsightResult", + "EvaluationRunClusterInsightsRequest", + "EvaluationScheduleTask", + "EvaluationTaxonomy", + "EvaluationTaxonomyInput", + "EvaluatorDefinition", + "EvaluatorMetric", + "EvaluatorVersion", + "FabricDataAgentToolParameters", "FieldMapping", "FileDatasetVersion", + "FileSearchTool", + "FileSearchToolCallItemParam", + "FileSearchToolCallItemParamResult", + "FileSearchToolCallItemResource", "FolderDatasetVersion", + "FunctionTool", + "FunctionToolCallItemParam", + "FunctionToolCallItemResource", + "FunctionToolCallOutputItemParam", + "FunctionToolCallOutputItemResource", + "HostedAgentDefinition", + "HourlyRecurrenceSchedule", + "HumanEvaluationRuleAction", + "ImageBasedHostedAgentDefinition", + "ImageGenTool", + "ImageGenToolCallItemParam", + "ImageGenToolCallItemResource", + "ImageGenToolInputImageMask", "Index", - "InputData", - "InputDataset", + "Insight", + "InsightCluster", + "InsightModelConfiguration", + "InsightRequest", + "InsightResult", + "InsightSample", + "InsightScheduleTask", + "InsightSummary", + "InsightsMetadata", + "InvokeAzureAgentWorkflowActionOutputItemResource", + "ItemContent", + "ItemContentInputAudio", + "ItemContentInputFile", + "ItemContentInputImage", + "ItemContentInputText", + "ItemContentOutputAudio", + "ItemContentOutputText", + "ItemContentRefusal", + "ItemParam", + "ItemReferenceItemParam", + "ItemResource", + "LocalShellExecAction", + "LocalShellTool", + "LocalShellToolCallItemParam", + "LocalShellToolCallItemResource", + "LocalShellToolCallOutputItemParam", + "LocalShellToolCallOutputItemResource", + "Location", + "LogProb", + "MCPApprovalRequestItemParam", + "MCPApprovalRequestItemResource", + "MCPApprovalResponseItemParam", + "MCPApprovalResponseItemResource", + "MCPCallItemParam", + "MCPCallItemResource", + "MCPListToolsItemParam", + "MCPListToolsItemResource", + "MCPListToolsTool", + "MCPTool", + "MCPToolAllowedTools1", + "MCPToolRequireApproval1", + "MCPToolRequireApprovalAlways", + "MCPToolRequireApprovalNever", "ManagedAzureAISearchIndex", - "Message", + "MemoryItem", + "MemoryOperation", + "MemorySearchItem", + "MemorySearchOptions", + "MemorySearchTool", + "MemorySearchToolCallItemParam", + "MemorySearchToolCallItemResource", + "MemoryStoreDefaultDefinition", + "MemoryStoreDefaultOptions", + "MemoryStoreDefinition", + "MemoryStoreDeleteScopeResponse", + "MemoryStoreObject", + "MemoryStoreOperationUsage", + "MemoryStoreOperationUsageInputTokensDetails", + "MemoryStoreOperationUsageOutputTokensDetails", + "MemoryStoreSearchResponse", + "MemoryStoreUpdateResponse", + "MemoryStoreUpdateResult", + "MicrosoftFabricAgentTool", "ModelDeployment", "ModelDeploymentSku", - "ModelResponseGenerationTarget", + "MonthlyRecurrenceSchedule", "NoAuthenticationCredentials", + "OAuthConsentRequestItemResource", + "OneTimeTrigger", + "OpenApiAgentTool", + "OpenApiAnonymousAuthDetails", + "OpenApiAuthDetails", + "OpenApiFunctionDefinition", + "OpenApiFunctionDefinitionFunction", + "OpenApiManagedAuthDetails", + "OpenApiManagedSecurityScheme", + "OpenApiProjectConnectionAuthDetails", + "OpenApiProjectConnectionSecurityScheme", + "PagedScheduleRun", "PendingUploadRequest", "PendingUploadResponse", + "Prompt", + "PromptAgentDefinition", + "PromptAgentDefinitionText", + "PromptBasedEvaluatorDefinition", + "ProtocolVersionRecord", + "RaiConfig", + "RankingOptions", + "Reasoning", + "ReasoningItemParam", + "ReasoningItemResource", + "ReasoningItemSummaryPart", + "ReasoningItemSummaryTextPart", + "RecurrenceSchedule", + "RecurrenceTrigger", "RedTeam", + "Response", + "ResponseCodeInterpreterCallCodeDeltaEvent", + "ResponseCodeInterpreterCallCodeDoneEvent", + "ResponseCodeInterpreterCallCompletedEvent", + "ResponseCodeInterpreterCallInProgressEvent", + "ResponseCodeInterpreterCallInterpretingEvent", + "ResponseCompletedEvent", + "ResponseContentPartAddedEvent", + "ResponseContentPartDoneEvent", + "ResponseConversation1", + "ResponseCreatedEvent", + "ResponseError", + "ResponseErrorEvent", + "ResponseFailedEvent", + "ResponseFileSearchCallCompletedEvent", + "ResponseFileSearchCallInProgressEvent", + "ResponseFileSearchCallSearchingEvent", + "ResponseFormatJsonSchemaSchema", + "ResponseFunctionCallArgumentsDeltaEvent", + "ResponseFunctionCallArgumentsDoneEvent", + "ResponseImageGenCallCompletedEvent", + "ResponseImageGenCallGeneratingEvent", + "ResponseImageGenCallInProgressEvent", + "ResponseImageGenCallPartialImageEvent", + "ResponseInProgressEvent", + "ResponseIncompleteDetails1", + "ResponseIncompleteEvent", + "ResponseMCPCallArgumentsDeltaEvent", + "ResponseMCPCallArgumentsDoneEvent", + "ResponseMCPCallCompletedEvent", + "ResponseMCPCallFailedEvent", + "ResponseMCPCallInProgressEvent", + "ResponseMCPListToolsCompletedEvent", + "ResponseMCPListToolsFailedEvent", + "ResponseMCPListToolsInProgressEvent", + "ResponseOutputItemAddedEvent", + "ResponseOutputItemDoneEvent", + "ResponsePromptVariables", + "ResponseQueuedEvent", + "ResponseReasoningDeltaEvent", + "ResponseReasoningDoneEvent", + "ResponseReasoningSummaryDeltaEvent", + "ResponseReasoningSummaryDoneEvent", + "ResponseReasoningSummaryPartAddedEvent", + "ResponseReasoningSummaryPartDoneEvent", + "ResponseReasoningSummaryTextDeltaEvent", + "ResponseReasoningSummaryTextDoneEvent", + "ResponseRefusalDeltaEvent", + "ResponseRefusalDoneEvent", + "ResponseStreamEvent", + "ResponseText", + "ResponseTextDeltaEvent", + "ResponseTextDoneEvent", + "ResponseTextFormatConfiguration", + "ResponseTextFormatConfigurationJsonObject", + "ResponseTextFormatConfigurationJsonSchema", + "ResponseTextFormatConfigurationText", + "ResponseUsage", + "ResponseWebSearchCallCompletedEvent", + "ResponseWebSearchCallInProgressEvent", + "ResponseWebSearchCallSearchingEvent", + "ResponsesAssistantMessageItemParam", + "ResponsesAssistantMessageItemResource", + "ResponsesDeveloperMessageItemParam", + "ResponsesDeveloperMessageItemResource", + "ResponsesMessageItemParam", + "ResponsesMessageItemResource", + "ResponsesSystemMessageItemParam", + "ResponsesSystemMessageItemResource", + "ResponsesUserMessageItemParam", + "ResponsesUserMessageItemResource", "SASCredentials", - "SystemMessage", + "Schedule", + "ScheduleRun", + "ScheduleTask", + "SharepointAgentTool", + "SharepointGroundingToolParameters", + "StructuredInputDefinition", + "StructuredOutputDefinition", + "StructuredOutputsItemResource", + "Target", "TargetConfig", - "UserMessage", + "TaxonomyCategory", + "TaxonomySubCategory", + "Tool", + "ToolArgumentBinding", + "ToolChoiceObject", + "ToolChoiceObjectCodeInterpreter", + "ToolChoiceObjectComputer", + "ToolChoiceObjectFileSearch", + "ToolChoiceObjectFunction", + "ToolChoiceObjectImageGen", + "ToolChoiceObjectMCP", + "ToolChoiceObjectWebSearch", + "ToolDescription", + "ToolProjectConnection", + "ToolProjectConnectionList", + "TopLogProb", + "Trigger", + "UserProfileMemoryItem", + "VectorStoreFileAttributes", + "WebSearchAction", + "WebSearchActionFind", + "WebSearchActionOpenPage", + "WebSearchActionSearch", + "WebSearchPreviewTool", + "WebSearchToolCallItemParam", + "WebSearchToolCallItemResource", + "WeeklyRecurrenceSchedule", + "WorkflowActionOutputItemResource", + "WorkflowDefinition", + "AgentContainerOperationStatus", + "AgentContainerStatus", + "AgentKind", + "AgentProtocol", + "AnnotationType", "AttackStrategy", + "AzureAISearchQueryType", + "CodeInterpreterOutputType", + "ComputerActionType", + "ComputerToolCallOutputItemOutputType", "ConnectionType", "CredentialType", "DatasetType", + "DayOfWeek", "DeploymentType", - "EvaluationTargetType", + "EvaluationRuleActionType", + "EvaluationRuleEventType", + "EvaluationTaxonomyInputType", + "EvaluatorCategory", + "EvaluatorDefinitionType", + "EvaluatorMetricDirection", + "EvaluatorMetricType", + "EvaluatorType", "IndexType", + "InsightType", + "ItemContentType", + "ItemType", + "LocationType", + "MemoryItemKind", + "MemoryOperationKind", + "MemoryStoreKind", + "MemoryStoreUpdateStatus", + "OpenApiAuthType", + "OperationState", "PendingUploadType", + "ReasoningEffort", + "ReasoningItemSummaryPartType", + "RecurrenceType", + "ResponseErrorCode", + "ResponseStreamEventType", + "ResponseTextFormatConfigurationType", + "ResponsesMessageRole", "RiskCategory", + "SampleType", + "ScheduleProvisioningStatus", + "ScheduleTaskType", + "ServiceTier", + "ToolChoiceObjectType", + "ToolChoiceOptions", + "ToolType", + "TreatmentEffectType", + "TriggerType", + "WebSearchActionType", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore _patch_sdk() diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/models/_enums.py b/sdk/ai/azure-ai-projects/azure/ai/projects/models/_enums.py index 3d16fe411605..86ee53efe0e2 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/models/_enums.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/models/_enums.py @@ -10,6 +10,65 @@ from azure.core import CaseInsensitiveEnumMeta +class AgentContainerOperationStatus(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Status of the container operation for a specific version of an agent.""" + + NOT_STARTED = "NotStarted" + """The container operation is not started.""" + IN_PROGRESS = "InProgress" + """The container operation is in progress.""" + SUCCEEDED = "Succeeded" + """The container operation has succeeded.""" + FAILED = "Failed" + """The container operation has failed.""" + + +class AgentContainerStatus(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Status of the container of a specific version of an agent.""" + + STARTING = "Starting" + """The container is starting.""" + RUNNING = "Running" + """The container is running.""" + STOPPING = "Stopping" + """The container is stopping.""" + STOPPED = "Stopped" + """The container is stopped.""" + FAILED = "Failed" + """The container has failed.""" + DELETING = "Deleting" + """The container is deleting.""" + DELETED = "Deleted" + """The container is deleted.""" + UPDATING = "Updating" + """The container is updating.""" + + +class AgentKind(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of AgentKind.""" + + PROMPT = "prompt" + HOSTED = "hosted" + CONTAINER_APP = "container_app" + WORKFLOW = "workflow" + + +class AgentProtocol(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of AgentProtocol.""" + + ACTIVITY_PROTOCOL = "activity_protocol" + RESPONSES = "responses" + + +class AnnotationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of AnnotationType.""" + + FILE_CITATION = "file_citation" + URL_CITATION = "url_citation" + FILE_PATH = "file_path" + CONTAINER_FILE_CITATION = "container_file_citation" + + class AttackStrategy(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Strategies for attacks.""" @@ -73,6 +132,48 @@ class AttackStrategy(str, Enum, metaclass=CaseInsensitiveEnumMeta): attack objective.""" +class AzureAISearchQueryType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Available query types for Azure AI Search tool.""" + + SIMPLE = "simple" + """Query type ``simple``""" + SEMANTIC = "semantic" + """Query type ``semantic``""" + VECTOR = "vector" + """Query type ``vector``""" + VECTOR_SIMPLE_HYBRID = "vector_simple_hybrid" + """Query type ``vector_simple_hybrid``""" + VECTOR_SEMANTIC_HYBRID = "vector_semantic_hybrid" + """Query type ``vector_semantic_hybrid``""" + + +class CodeInterpreterOutputType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of CodeInterpreterOutputType.""" + + LOGS = "logs" + IMAGE = "image" + + +class ComputerActionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of ComputerActionType.""" + + SCREENSHOT = "screenshot" + CLICK = "click" + DOUBLE_CLICK = "double_click" + SCROLL = "scroll" + TYPE = "type" + WAIT = "wait" + KEYPRESS = "keypress" + DRAG = "drag" + MOVE = "move" + + +class ComputerToolCallOutputItemOutputType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """A computer screenshot image used with the computer use tool.""" + + SCREENSHOT = "computer_screenshot" + + class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """The Type (or category) of the connection.""" @@ -94,6 +195,8 @@ class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Application Insights""" CUSTOM = "CustomKeys" """Custom Keys""" + REMOTE_TOOL = "RemoteTool" + """Remote tool""" class CredentialType(str, Enum, metaclass=CaseInsensitiveEnumMeta): @@ -109,6 +212,8 @@ class CredentialType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Custom credential""" NONE = "None" """No credential""" + AGENTIC_IDENTITY = "AgenticIdentityToken" + """Agentic identity credential""" class DatasetType(str, Enum, metaclass=CaseInsensitiveEnumMeta): @@ -120,6 +225,25 @@ class DatasetType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """URI folder.""" +class DayOfWeek(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Days of the week for recurrence schedule.""" + + SUNDAY = "Sunday" + """Sunday.""" + MONDAY = "Monday" + """Monday.""" + TUESDAY = "Tuesday" + """Tuesday.""" + WEDNESDAY = "Wednesday" + """Wednesday.""" + THURSDAY = "Thursday" + """Thursday.""" + FRIDAY = "Friday" + """Friday.""" + SATURDAY = "Saturday" + """Saturday.""" + + class DeploymentType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Type of DeploymentType.""" @@ -127,11 +251,90 @@ class DeploymentType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Model deployment""" -class EvaluationTargetType(str, Enum, metaclass=CaseInsensitiveEnumMeta): - """Allowed types of evaluation targets.""" +class EvaluationRuleActionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of the evaluation action.""" + + CONTINUOUS_EVALUATION = "continuousEvaluation" + """Continuous evaluation.""" + HUMAN_EVALUATION = "humanEvaluation" + """Human evaluation.""" + + +class EvaluationRuleEventType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of the evaluation rule event.""" + + RESPONSE_COMPLETED = "response.completed" + """Response completed.""" + MANUAL = "manual" + """Manual trigger.""" + + +class EvaluationTaxonomyInputType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of the evaluation taxonomy input.""" - MODEL_RESPONSE_GENERATION = "modelResponseGeneration" - """Evaluation target that uses a model for response generation.""" + AGENT = "agent" + """Agent""" + POLICY = "policy" + """Policy.""" + + +class EvaluatorCategory(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The category of the evaluator.""" + + QUALITY = "quality" + """Quality""" + SAFETY = "safety" + """Risk & Safety""" + AGENTS = "agents" + """Agents""" + + +class EvaluatorDefinitionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of evaluator definition.""" + + PROMPT = "prompt" + """Prompt-based definition""" + CODE = "code" + """Code-based definition""" + PROMPT_AND_CODE = "prompt_and_code" + """Prompt & Code Based definition""" + SERVICE = "service" + """Service-based evaluator""" + OPENAI_GRADERS = "openai_graders" + """OpenAI graders""" + + +class EvaluatorMetricDirection(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The direction of the metric indicating whether a higher value is better, a lower value is + better, or neutral. + """ + + INCREASE = "increase" + """It indicates a higher value is better for this metric""" + DECREASE = "decrease" + """It indicates a lower value is better for this metric""" + NEUTRAL = "neutral" + """It indicates no preference for this metric direction""" + + +class EvaluatorMetricType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of the evaluator.""" + + ORDINAL = "ordinal" + """Ordinal metric representing categories that can be ordered or ranked.""" + CONTINUOUS = "continuous" + """Continuous metric representing values in a continuous range.""" + BOOLEAN = "boolean" + """Boolean metric representing true/false values""" + + +class EvaluatorType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of the evaluator.""" + + BUILT_IN = "builtin" + """Built-in evaluator (Microsoft provided)""" + CUSTOM = "custom" + """Custom evaluator""" class IndexType(str, Enum, metaclass=CaseInsensitiveEnumMeta): @@ -145,6 +348,126 @@ class IndexType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Managed Azure Search""" +class InsightType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The request of the insights.""" + + EVALUATION_RUN_CLUSTER_INSIGHT = "EvaluationRunClusterInsight" + """Insights on an Evaluation run result.""" + AGENT_CLUSTER_INSIGHT = "AgentClusterInsight" + """Cluster Insight on an Agent.""" + EVALUATION_COMPARISON = "EvaluationComparison" + """Evaluation Comparison.""" + + +class ItemContentType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Multi-modal input and output contents.""" + + INPUT_TEXT = "input_text" + INPUT_AUDIO = "input_audio" + INPUT_IMAGE = "input_image" + INPUT_FILE = "input_file" + OUTPUT_TEXT = "output_text" + OUTPUT_AUDIO = "output_audio" + REFUSAL = "refusal" + + +class ItemType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of ItemType.""" + + MESSAGE = "message" + FILE_SEARCH_CALL = "file_search_call" + FUNCTION_CALL = "function_call" + FUNCTION_CALL_OUTPUT = "function_call_output" + COMPUTER_CALL = "computer_call" + COMPUTER_CALL_OUTPUT = "computer_call_output" + WEB_SEARCH_CALL = "web_search_call" + REASONING = "reasoning" + ITEM_REFERENCE = "item_reference" + IMAGE_GENERATION_CALL = "image_generation_call" + CODE_INTERPRETER_CALL = "code_interpreter_call" + LOCAL_SHELL_CALL = "local_shell_call" + LOCAL_SHELL_CALL_OUTPUT = "local_shell_call_output" + MCP_LIST_TOOLS = "mcp_list_tools" + MCP_APPROVAL_REQUEST = "mcp_approval_request" + MCP_APPROVAL_RESPONSE = "mcp_approval_response" + MCP_CALL = "mcp_call" + STRUCTURED_OUTPUTS = "structured_outputs" + WORKFLOW_ACTION = "workflow_action" + MEMORY_SEARCH_CALL = "memory_search_call" + OAUTH_CONSENT_REQUEST = "oauth_consent_request" + + +class LocationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of LocationType.""" + + APPROXIMATE = "approximate" + + +class MemoryItemKind(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Memory item kind.""" + + USER_PROFILE = "user_profile" + """User profile information extracted from conversations.""" + CHAT_SUMMARY = "chat_summary" + """Summary of chat conversations.""" + + +class MemoryOperationKind(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Memory operation kind.""" + + CREATE = "create" + """Create a new memory item.""" + UPDATE = "update" + """Update an existing memory item.""" + DELETE = "delete" + """Delete an existing memory item.""" + + +class MemoryStoreKind(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of memory store implementation to use.""" + + DEFAULT = "default" + """The default memory store implementation.""" + + +class MemoryStoreUpdateStatus(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Status of a memory store update operation.""" + + QUEUED = "queued" + IN_PROGRESS = "in_progress" + COMPLETED = "completed" + FAILED = "failed" + SUPERSEDED = "superseded" + + +class OpenApiAuthType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Authentication type for OpenApi endpoint. Allowed types are: + + * Anonymous (no authentication required) + * Project Connection (requires project_connection_id to endpoint, as setup in AI Foundry) + * Managed_Identity (requires audience for identity based auth). + """ + + ANONYMOUS = "anonymous" + PROJECT_CONNECTION = "project_connection" + MANAGED_IDENTITY = "managed_identity" + + +class OperationState(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Enum describing allowed operation states.""" + + NOT_STARTED = "NotStarted" + """The operation has not started.""" + RUNNING = "Running" + """The operation is in progress.""" + SUCCEEDED = "Succeeded" + """The operation has completed successfully.""" + FAILED = "Failed" + """The operation has failed.""" + CANCELED = "Canceled" + """The operation has been canceled by the user.""" + + class PendingUploadType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """The type of pending upload.""" @@ -154,6 +477,151 @@ class PendingUploadType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Blob Reference is the only supported type.""" +class ReasoningEffort(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """**o-series models only** + + Constrains effort on reasoning for + `reasoning models `_. + Currently supported values are ``low``, ``medium``, and ``high``. Reducing + reasoning effort can result in faster responses and fewer tokens used + on reasoning in a response. + """ + + LOW = "low" + MEDIUM = "medium" + HIGH = "high" + + +class ReasoningItemSummaryPartType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of ReasoningItemSummaryPartType.""" + + SUMMARY_TEXT = "summary_text" + + +class RecurrenceType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Recurrence type.""" + + HOURLY = "Hourly" + """Hourly recurrence pattern.""" + DAILY = "Daily" + """Daily recurrence pattern.""" + WEEKLY = "Weekly" + """Weekly recurrence pattern.""" + MONTHLY = "Monthly" + """Monthly recurrence pattern.""" + + +class ResponseErrorCode(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The error code for the response.""" + + SERVER_ERROR = "server_error" + RATE_LIMIT_EXCEEDED = "rate_limit_exceeded" + INVALID_PROMPT = "invalid_prompt" + VECTOR_STORE_TIMEOUT = "vector_store_timeout" + INVALID_IMAGE = "invalid_image" + INVALID_IMAGE_FORMAT = "invalid_image_format" + INVALID_BASE64_IMAGE = "invalid_base64_image" + INVALID_IMAGE_URL = "invalid_image_url" + IMAGE_TOO_LARGE = "image_too_large" + IMAGE_TOO_SMALL = "image_too_small" + IMAGE_PARSE_ERROR = "image_parse_error" + IMAGE_CONTENT_POLICY_VIOLATION = "image_content_policy_violation" + INVALID_IMAGE_MODE = "invalid_image_mode" + IMAGE_FILE_TOO_LARGE = "image_file_too_large" + UNSUPPORTED_IMAGE_MEDIA_TYPE = "unsupported_image_media_type" + EMPTY_IMAGE_FILE = "empty_image_file" + FAILED_TO_DOWNLOAD_IMAGE = "failed_to_download_image" + IMAGE_FILE_NOT_FOUND = "image_file_not_found" + + +class ResponsesMessageRole(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The collection of valid roles for responses message items.""" + + SYSTEM = "system" + DEVELOPER = "developer" + USER = "user" + ASSISTANT = "assistant" + + +class ResponseStreamEventType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of ResponseStreamEventType.""" + + RESPONSE_AUDIO_DELTA = "response.audio.delta" + RESPONSE_AUDIO_DONE = "response.audio.done" + RESPONSE_AUDIO_TRANSCRIPT_DELTA = "response.audio_transcript.delta" + RESPONSE_AUDIO_TRANSCRIPT_DONE = "response.audio_transcript.done" + RESPONSE_CODE_INTERPRETER_CALL_CODE_DELTA = "response.code_interpreter_call_code.delta" + RESPONSE_CODE_INTERPRETER_CALL_CODE_DONE = "response.code_interpreter_call_code.done" + RESPONSE_CODE_INTERPRETER_CALL_COMPLETED = "response.code_interpreter_call.completed" + RESPONSE_CODE_INTERPRETER_CALL_IN_PROGRESS = "response.code_interpreter_call.in_progress" + RESPONSE_CODE_INTERPRETER_CALL_INTERPRETING = "response.code_interpreter_call.interpreting" + RESPONSE_COMPLETED = "response.completed" + RESPONSE_CONTENT_PART_ADDED = "response.content_part.added" + RESPONSE_CONTENT_PART_DONE = "response.content_part.done" + RESPONSE_CREATED = "response.created" + ERROR = "error" + RESPONSE_FILE_SEARCH_CALL_COMPLETED = "response.file_search_call.completed" + RESPONSE_FILE_SEARCH_CALL_IN_PROGRESS = "response.file_search_call.in_progress" + RESPONSE_FILE_SEARCH_CALL_SEARCHING = "response.file_search_call.searching" + RESPONSE_FUNCTION_CALL_ARGUMENTS_DELTA = "response.function_call_arguments.delta" + RESPONSE_FUNCTION_CALL_ARGUMENTS_DONE = "response.function_call_arguments.done" + RESPONSE_IN_PROGRESS = "response.in_progress" + RESPONSE_FAILED = "response.failed" + RESPONSE_INCOMPLETE = "response.incomplete" + RESPONSE_OUTPUT_ITEM_ADDED = "response.output_item.added" + RESPONSE_OUTPUT_ITEM_DONE = "response.output_item.done" + RESPONSE_REFUSAL_DELTA = "response.refusal.delta" + RESPONSE_REFUSAL_DONE = "response.refusal.done" + RESPONSE_OUTPUT_TEXT_ANNOTATION_ADDED = "response.output_text.annotation.added" + RESPONSE_OUTPUT_TEXT_DELTA = "response.output_text.delta" + RESPONSE_OUTPUT_TEXT_DONE = "response.output_text.done" + RESPONSE_REASONING_SUMMARY_PART_ADDED = "response.reasoning_summary_part.added" + RESPONSE_REASONING_SUMMARY_PART_DONE = "response.reasoning_summary_part.done" + RESPONSE_REASONING_SUMMARY_TEXT_DELTA = "response.reasoning_summary_text.delta" + RESPONSE_REASONING_SUMMARY_TEXT_DONE = "response.reasoning_summary_text.done" + RESPONSE_WEB_SEARCH_CALL_COMPLETED = "response.web_search_call.completed" + RESPONSE_WEB_SEARCH_CALL_IN_PROGRESS = "response.web_search_call.in_progress" + RESPONSE_WEB_SEARCH_CALL_SEARCHING = "response.web_search_call.searching" + RESPONSE_IMAGE_GENERATION_CALL_COMPLETED = "response.image_generation_call.completed" + RESPONSE_IMAGE_GENERATION_CALL_GENERATING = "response.image_generation_call.generating" + RESPONSE_IMAGE_GENERATION_CALL_IN_PROGRESS = "response.image_generation_call.in_progress" + RESPONSE_IMAGE_GENERATION_CALL_PARTIAL_IMAGE = "response.image_generation_call.partial_image" + RESPONSE_MCP_CALL_ARGUMENTS_DELTA = "response.mcp_call.arguments_delta" + RESPONSE_MCP_CALL_ARGUMENTS_DONE = "response.mcp_call.arguments_done" + RESPONSE_MCP_CALL_COMPLETED = "response.mcp_call.completed" + RESPONSE_MCP_CALL_FAILED = "response.mcp_call.failed" + RESPONSE_MCP_CALL_IN_PROGRESS = "response.mcp_call.in_progress" + RESPONSE_MCP_LIST_TOOLS_COMPLETED = "response.mcp_list_tools.completed" + RESPONSE_MCP_LIST_TOOLS_FAILED = "response.mcp_list_tools.failed" + RESPONSE_MCP_LIST_TOOLS_IN_PROGRESS = "response.mcp_list_tools.in_progress" + RESPONSE_QUEUED = "response.queued" + RESPONSE_REASONING_DELTA = "response.reasoning.delta" + RESPONSE_REASONING_DONE = "response.reasoning.done" + RESPONSE_REASONING_SUMMARY_DELTA = "response.reasoning_summary.delta" + RESPONSE_REASONING_SUMMARY_DONE = "response.reasoning_summary.done" + + +class ResponseTextFormatConfigurationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """An object specifying the format that the model must output. + + Configuring ``{ "type": "json_schema" }`` enables Structured Outputs, + which ensures the model will match your supplied JSON schema. Learn more in the + `Structured Outputs guide `_. + + The default format is ``{ "type": "text" }`` with no additional options. + + **Not recommended for gpt-4o and newer models:** + + Setting to ``{ "type": "json_object" }`` enables the older JSON mode, which + ensures the message the model generates is valid JSON. Using ``json_schema`` + is preferred for models that support it. + """ + + TEXT = "text" + JSON_SCHEMA = "json_schema" + JSON_OBJECT = "json_object" + + class RiskCategory(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Risk category for the attack objective.""" @@ -165,3 +633,146 @@ class RiskCategory(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Represents content of a sexual nature.""" SELF_HARM = "SelfHarm" """Represents content related to self-harm.""" + + +class SampleType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of sample used in the analysis.""" + + EVALUATION_RESULT_SAMPLE = "EvaluationResultSample" + """A sample from the evaluation result.""" + + +class ScheduleProvisioningStatus(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Schedule provisioning status.""" + + CREATING = "Creating" + """Represents the creation status of the schedule.""" + UPDATING = "Updating" + """Represents the updating status of the schedule.""" + DELETING = "Deleting" + """Represents the deleting status of the schedule.""" + SUCCEEDED = "Succeeded" + """Represents the succeeded status of the schedule.""" + FAILED = "Failed" + """Represents the failed status of the schedule.""" + + +class ScheduleTaskType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of the task.""" + + EVALUATION = "Evaluation" + """Evaluation task.""" + INSIGHT = "Insight" + """Insight task.""" + + +class ServiceTier(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Specifies the processing type used for serving the request. + + * If set to 'auto', then the request will be processed with the service tier configured in the + Project settings. Unless otherwise configured, the Project will use 'default'. + * If set to 'default', then the request will be processed with the standard pricing and + performance for the selected model. + * If set to '[flex](/docs/guides/flex-processing)' or 'priority', then the request will be + processed with the corresponding service tier. [Contact + sales](https://openai.com/contact-sales) to learn more about Priority processing. + * When not set, the default behavior is 'auto'. + + When the ``service_tier`` parameter is set, the response body will include the ``service_tier`` + value based on the processing mode actually used to serve the request. This response value may + be different from the value set in the parameter. + """ + + AUTO = "auto" + DEFAULT = "default" + FLEX = "flex" + SCALE = "scale" + PRIORITY = "priority" + + +class ToolChoiceObjectType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Indicates that the model should use a built-in tool to generate a response. + `Learn more about built-in tools `_. + """ + + FILE_SEARCH = "file_search" + FUNCTION = "function" + COMPUTER = "computer_use_preview" + WEB_SEARCH = "web_search_preview" + IMAGE_GENERATION = "image_generation" + CODE_INTERPRETER = "code_interpreter" + MCP = "mcp" + + +class ToolChoiceOptions(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Controls which (if any) tool is called by the model. + + ``none`` means the model will not call any tool and instead generates a message. + + ``auto`` means the model can pick between generating a message or calling one or + more tools. + + ``required`` means the model must call one or more tools. + """ + + NONE = "none" + AUTO = "auto" + REQUIRED = "required" + + +class ToolType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """A tool that can be used to generate a response.""" + + FILE_SEARCH = "file_search" + FUNCTION = "function" + COMPUTER_USE_PREVIEW = "computer_use_preview" + WEB_SEARCH_PREVIEW = "web_search_preview" + MCP = "mcp" + CODE_INTERPRETER = "code_interpreter" + IMAGE_GENERATION = "image_generation" + LOCAL_SHELL = "local_shell" + BING_GROUNDING = "bing_grounding" + BROWSER_AUTOMATION_PREVIEW = "browser_automation_preview" + FABRIC_DATAAGENT_PREVIEW = "fabric_dataagent_preview" + SHAREPOINT_GROUNDING_PREVIEW = "sharepoint_grounding_preview" + AZURE_AI_SEARCH = "azure_ai_search" + OPENAPI = "openapi" + BING_CUSTOM_SEARCH_PREVIEW = "bing_custom_search_preview" + CAPTURE_STRUCTURED_OUTPUTS = "capture_structured_outputs" + A2_A_PREVIEW = "a2a_preview" + AZURE_FUNCTION = "azure_function" + MEMORY_SEARCH = "memory_search" + + +class TreatmentEffectType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Treatment Effect Type.""" + + TOO_FEW_SAMPLES = "TooFewSamples" + """Not enough samples to determine treatment effect.""" + INCONCLUSIVE = "Inconclusive" + """No significant difference between treatment and baseline.""" + CHANGED = "Changed" + """Indicates the metric changed with statistical significance, but the direction is neutral.""" + IMPROVED = "Improved" + """Indicates the treatment significantly improved the metric compared to baseline.""" + DEGRADED = "Degraded" + """Indicates the treatment significantly degraded the metric compared to baseline.""" + + +class TriggerType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of the trigger.""" + + CRON = "Cron" + """Cron based trigger.""" + RECURRENCE = "Recurrence" + """Recurrence based trigger.""" + ONE_TIME = "OneTime" + """One-time trigger.""" + + +class WebSearchActionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of WebSearchActionType.""" + + SEARCH = "search" + OPEN_PAGE = "open_page" + FIND = "find" diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/models/_models.py b/sdk/ai/azure-ai-projects/azure/ai/projects/models/_models.py index 15115bc41114..0cea37c9922c 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/models/_models.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/models/_models.py @@ -8,47 +8,80 @@ # -------------------------------------------------------------------------- # pylint: disable=useless-super-delegation +import datetime from typing import Any, Literal, Mapping, Optional, TYPE_CHECKING, Union, overload from .._utils.model_base import Model as _Model, rest_discriminator, rest_field -from ._enums import CredentialType, DatasetType, DeploymentType, EvaluationTargetType, IndexType, PendingUploadType +from ._enums import ( + AgentKind, + AnnotationType, + CodeInterpreterOutputType, + ComputerActionType, + ComputerToolCallOutputItemOutputType, + CredentialType, + DatasetType, + DeploymentType, + EvaluationRuleActionType, + EvaluationTaxonomyInputType, + EvaluatorDefinitionType, + IndexType, + InsightType, + ItemContentType, + ItemType, + LocationType, + MemoryItemKind, + MemoryStoreKind, + OpenApiAuthType, + PendingUploadType, + ReasoningItemSummaryPartType, + RecurrenceType, + ResponseStreamEventType, + ResponseTextFormatConfigurationType, + ResponsesMessageRole, + SampleType, + ScheduleTaskType, + ToolChoiceObjectType, + ToolType, + TriggerType, + WebSearchActionType, +) if TYPE_CHECKING: - from .. import models as _models + from .. import _types, models as _models -class AgentEvaluation(_Model): - """Evaluation response for agent evaluation run. +class Tool(_Model): + """Tool. - :ivar id: Identifier of the agent evaluation run. Required. - :vartype id: str - :ivar status: Status of the agent evaluation. Options: Running, Completed, Failed. Required. - :vartype status: str - :ivar error: The reason of the request failure for the long running process, if applicable. - :vartype error: str - :ivar result: The agent evaluation result. - :vartype result: list[~azure.ai.projects.models.AgentEvaluationResult] + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + A2ATool, AzureAISearchAgentTool, AzureFunctionAgentTool, BingCustomSearchAgentTool, + BingGroundingAgentTool, BrowserAutomationAgentTool, CaptureStructuredOutputsTool, + CodeInterpreterTool, ComputerUsePreviewTool, MicrosoftFabricAgentTool, FileSearchTool, + FunctionTool, ImageGenTool, LocalShellTool, MCPTool, MemorySearchTool, OpenApiAgentTool, + SharepointAgentTool, WebSearchPreviewTool + + :ivar type: Required. Known values are: "file_search", "function", "computer_use_preview", + "web_search_preview", "mcp", "code_interpreter", "image_generation", "local_shell", + "bing_grounding", "browser_automation_preview", "fabric_dataagent_preview", + "sharepoint_grounding_preview", "azure_ai_search", "openapi", "bing_custom_search_preview", + "capture_structured_outputs", "a2a_preview", "azure_function", and "memory_search". + :vartype type: str or ~azure.ai.projects.models.ToolType """ - id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Identifier of the agent evaluation run. Required.""" - status: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Status of the agent evaluation. Options: Running, Completed, Failed. Required.""" - error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """The reason of the request failure for the long running process, if applicable.""" - result: Optional[list["_models.AgentEvaluationResult"]] = rest_field( - visibility=["read", "create", "update", "delete", "query"] - ) - """The agent evaluation result.""" + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"file_search\", \"function\", \"computer_use_preview\", + \"web_search_preview\", \"mcp\", \"code_interpreter\", \"image_generation\", \"local_shell\", + \"bing_grounding\", \"browser_automation_preview\", \"fabric_dataagent_preview\", + \"sharepoint_grounding_preview\", \"azure_ai_search\", \"openapi\", + \"bing_custom_search_preview\", \"capture_structured_outputs\", \"a2a_preview\", + \"azure_function\", and \"memory_search\".""" @overload def __init__( self, *, - id: str, # pylint: disable=redefined-builtin - status: str, - error: Optional[str] = None, - result: Optional[list["_models.AgentEvaluationResult"]] = None, + type: str, ) -> None: ... @overload @@ -62,24 +95,41 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class AgentEvaluationRedactionConfiguration(_Model): - """The redaction configuration will allow the user to control what is redacted. - - :ivar redact_score_properties: Redact score properties. If not specified, the default is to - redact in production. - :vartype redact_score_properties: bool +class A2ATool(Tool, discriminator="a2a_preview"): + """An agent implementing the A2A protocol. + + :ivar type: The type of the tool. Always ``a2a``. Required. + :vartype type: str or ~azure.ai.projects.models.A2_A_PREVIEW + :ivar base_url: Base URL of the agent. + :vartype base_url: str + :ivar agent_card_path: The path to the agent card relative to the ``base_url``. + If not provided, defaults to ``/.well-known/agent-card.json``. + :vartype agent_card_path: str + :ivar project_connection_id: The connection ID in the project for the A2A server. + The connection stores authentication and other connection details needed to connect to the A2A + server. + :vartype project_connection_id: str """ - redact_score_properties: Optional[bool] = rest_field( - name="redactScoreProperties", visibility=["read", "create", "update", "delete", "query"] - ) - """Redact score properties. If not specified, the default is to redact in production.""" + type: Literal[ToolType.A2_A_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the tool. Always ``a2a``. Required.""" + base_url: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Base URL of the agent.""" + agent_card_path: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The path to the agent card relative to the ``base_url``. + If not provided, defaults to ``/.well-known/agent-card.json``.""" + project_connection_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The connection ID in the project for the A2A server. + The connection stores authentication and other connection details needed to connect to the A2A + server.""" @overload def __init__( self, *, - redact_score_properties: Optional[bool] = None, + base_url: Optional[str] = None, + agent_card_path: Optional[str] = None, + project_connection_id: Optional[str] = None, ) -> None: ... @overload @@ -91,61 +141,30 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolType.A2_A_PREVIEW # type: ignore -class AgentEvaluationRequest(_Model): - """Evaluation request for agent run. +class InsightResult(_Model): + """The result of the insights. - :ivar run_id: Identifier of the agent run. Required. - :vartype run_id: str - :ivar thread_id: Identifier of the agent thread. This field is mandatory currently, but it will - be optional in the future. - :vartype thread_id: str - :ivar evaluators: Evaluators to be used for the evaluation. Required. - :vartype evaluators: dict[str, ~azure.ai.projects.models.EvaluatorConfiguration] - :ivar sampling_configuration: Sampling configuration for the evaluation. - :vartype sampling_configuration: ~azure.ai.projects.models.AgentEvaluationSamplingConfiguration - :ivar redaction_configuration: Redaction configuration for the evaluation. - :vartype redaction_configuration: - ~azure.ai.projects.models.AgentEvaluationRedactionConfiguration - :ivar app_insights_connection_string: Pass the AppInsights connection string to the agent - evaluation for the evaluation results and the errors logs. Required. - :vartype app_insights_connection_string: str + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AgentClusterInsightResult, EvalCompareReport, EvaluationRunClusterInsightResult + + :ivar type: The type of insights result. Required. Known values are: + "EvaluationRunClusterInsight", "AgentClusterInsight", and "EvaluationComparison". + :vartype type: str or ~azure.ai.projects.models.InsightType """ - run_id: str = rest_field(name="runId", visibility=["read", "create", "update", "delete", "query"]) - """Identifier of the agent run. Required.""" - thread_id: Optional[str] = rest_field(name="threadId", visibility=["read", "create", "update", "delete", "query"]) - """Identifier of the agent thread. This field is mandatory currently, but it will be optional in - the future.""" - evaluators: dict[str, "_models.EvaluatorConfiguration"] = rest_field( - visibility=["read", "create", "update", "delete", "query"] - ) - """Evaluators to be used for the evaluation. Required.""" - sampling_configuration: Optional["_models.AgentEvaluationSamplingConfiguration"] = rest_field( - name="samplingConfiguration", visibility=["read", "create", "update", "delete", "query"] - ) - """Sampling configuration for the evaluation.""" - redaction_configuration: Optional["_models.AgentEvaluationRedactionConfiguration"] = rest_field( - name="redactionConfiguration", visibility=["read", "create", "update", "delete", "query"] - ) - """Redaction configuration for the evaluation.""" - app_insights_connection_string: str = rest_field( - name="appInsightsConnectionString", visibility=["read", "create", "update", "delete", "query"] - ) - """Pass the AppInsights connection string to the agent evaluation for the evaluation results and - the errors logs. Required.""" + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of insights result. Required. Known values are: \"EvaluationRunClusterInsight\", + \"AgentClusterInsight\", and \"EvaluationComparison\".""" @overload def __init__( self, *, - run_id: str, - evaluators: dict[str, "_models.EvaluatorConfiguration"], - app_insights_connection_string: str, - thread_id: Optional[str] = None, - sampling_configuration: Optional["_models.AgentEvaluationSamplingConfiguration"] = None, - redaction_configuration: Optional["_models.AgentEvaluationRedactionConfiguration"] = None, + type: str, ) -> None: ... @overload @@ -159,72 +178,27 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class AgentEvaluationResult(_Model): - """Result for the agent evaluation evaluator run. +class AgentClusterInsightResult(InsightResult, discriminator="AgentClusterInsight"): + """Insights from the agent cluster analysis. - :ivar evaluator: Evaluator's name. This is the name of the evaluator that was used to evaluate - the agent's completion. Required. - :vartype evaluator: str - :ivar evaluator_id: Identifier of the evaluator. Required. - :vartype evaluator_id: str - :ivar score: Score of the given evaluator. No restriction on range. Required. - :vartype score: float - :ivar status: Status of the evaluator result. Options: Running, Completed, Failed, - NotApplicable. Required. - :vartype status: str - :ivar reason: Reasoning for the evaluation result. - :vartype reason: str - :ivar version: Version of the evaluator that was used to evaluate the agent's completion. - :vartype version: str - :ivar thread_id: The unique identifier of the thread. - :vartype thread_id: str - :ivar run_id: The unique identifier of the run. Required. - :vartype run_id: str - :ivar error: A string explaining why there was an error, if applicable. - :vartype error: str - :ivar additional_details: Additional properties relevant to the evaluator. These will differ - between evaluators. - :vartype additional_details: dict[str, str] + :ivar type: The type of insights result. Required. Cluster Insight on an Agent. + :vartype type: str or ~azure.ai.projects.models.AGENT_CLUSTER_INSIGHT + :ivar cluster_insight: Required. + :vartype cluster_insight: ~azure.ai.projects.models.ClusterInsightResult """ - evaluator: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Evaluator's name. This is the name of the evaluator that was used to evaluate the agent's - completion. Required.""" - evaluator_id: str = rest_field(name="evaluatorId", visibility=["read", "create", "update", "delete", "query"]) - """Identifier of the evaluator. Required.""" - score: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Score of the given evaluator. No restriction on range. Required.""" - status: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Status of the evaluator result. Options: Running, Completed, Failed, NotApplicable. Required.""" - reason: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Reasoning for the evaluation result.""" - version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Version of the evaluator that was used to evaluate the agent's completion.""" - thread_id: Optional[str] = rest_field(name="threadId", visibility=["read", "create", "update", "delete", "query"]) - """The unique identifier of the thread.""" - run_id: str = rest_field(name="runId", visibility=["read", "create", "update", "delete", "query"]) - """The unique identifier of the run. Required.""" - error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """A string explaining why there was an error, if applicable.""" - additional_details: Optional[dict[str, str]] = rest_field( - name="additionalDetails", visibility=["read", "create", "update", "delete", "query"] + type: Literal[InsightType.AGENT_CLUSTER_INSIGHT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of insights result. Required. Cluster Insight on an Agent.""" + cluster_insight: "_models.ClusterInsightResult" = rest_field( + name="clusterInsight", visibility=["read", "create", "update", "delete", "query"] ) - """Additional properties relevant to the evaluator. These will differ between evaluators.""" + """Required.""" @overload def __init__( self, *, - evaluator: str, - evaluator_id: str, - score: float, - status: str, - run_id: str, - reason: Optional[str] = None, - version: Optional[str] = None, - thread_id: Optional[str] = None, - error: Optional[str] = None, - additional_details: Optional[dict[str, str]] = None, + cluster_insight: "_models.ClusterInsightResult", ) -> None: ... @overload @@ -236,37 +210,30 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = InsightType.AGENT_CLUSTER_INSIGHT # type: ignore -class AgentEvaluationSamplingConfiguration(_Model): - """Definition for sampling strategy. +class InsightRequest(_Model): + """The request of the insights report. - :ivar name: Name of the sampling strategy. Required. - :vartype name: str - :ivar sampling_percent: Percentage of sampling per hour (0-100). Required. - :vartype sampling_percent: float - :ivar max_request_rate: Maximum request rate per hour (0 to 1000). Required. - :vartype max_request_rate: float + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AgentClusterInsightsRequest, EvaluationComparisonRequest, EvaluationRunClusterInsightsRequest + + :ivar type: The type of request. Required. Known values are: "EvaluationRunClusterInsight", + "AgentClusterInsight", and "EvaluationComparison". + :vartype type: str or ~azure.ai.projects.models.InsightType """ - name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Name of the sampling strategy. Required.""" - sampling_percent: float = rest_field( - name="samplingPercent", visibility=["read", "create", "update", "delete", "query"] - ) - """Percentage of sampling per hour (0-100). Required.""" - max_request_rate: float = rest_field( - name="maxRequestRate", visibility=["read", "create", "update", "delete", "query"] - ) - """Maximum request rate per hour (0 to 1000). Required.""" + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of request. Required. Known values are: \"EvaluationRunClusterInsight\", + \"AgentClusterInsight\", and \"EvaluationComparison\".""" @overload def __init__( self, *, - name: str, - sampling_percent: float, - max_request_rate: float, + type: str, ) -> None: ... @overload @@ -280,28 +247,92 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class BaseCredentials(_Model): - """A base class for connection credentials. +class AgentClusterInsightsRequest(InsightRequest, discriminator="AgentClusterInsight"): + """Insights on set of Agent Evaluation Results. - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - EntraIDCredentials, ApiKeyCredentials, CustomCredential, NoAuthenticationCredentials, - SASCredentials + :ivar type: The type of request. Required. Cluster Insight on an Agent. + :vartype type: str or ~azure.ai.projects.models.AGENT_CLUSTER_INSIGHT + :ivar agent_name: Identifier for the agent. Required. + :vartype agent_name: str + :ivar model_configuration: Configuration of the model used in the insight generation. + :vartype model_configuration: ~azure.ai.projects.models.InsightModelConfiguration + """ - :ivar type: The type of credential used by the connection. Required. Known values are: - "ApiKey", "AAD", "SAS", "CustomKeys", and "None". - :vartype type: str or ~azure.ai.projects.models.CredentialType + type: Literal[InsightType.AGENT_CLUSTER_INSIGHT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of request. Required. Cluster Insight on an Agent.""" + agent_name: str = rest_field(name="agentName", visibility=["read", "create", "update", "delete", "query"]) + """Identifier for the agent. Required.""" + model_configuration: Optional["_models.InsightModelConfiguration"] = rest_field( + name="modelConfiguration", visibility=["read", "create", "update", "delete", "query"] + ) + """Configuration of the model used in the insight generation.""" + + @overload + def __init__( + self, + *, + agent_name: str, + model_configuration: Optional["_models.InsightModelConfiguration"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = InsightType.AGENT_CLUSTER_INSIGHT # type: ignore + + +class AgentContainerObject(_Model): + """The details of the container of a specific version of an agent. + + :ivar object: The object type, which is always 'agent.container'. Required. Default value is + "agent.container". + :vartype object: str + :ivar status: The status of the container of a specific version of an agent. Required. Known + values are: "Starting", "Running", "Stopping", "Stopped", "Failed", "Deleting", "Deleted", and + "Updating". + :vartype status: str or ~azure.ai.projects.models.AgentContainerStatus + :ivar max_replicas: The maximum number of replicas for the container. Default is 1. + :vartype max_replicas: int + :ivar min_replicas: The minimum number of replicas for the container. Default is 1. + :vartype min_replicas: int + :ivar error_message: The error message if the container failed to operate, if any. + :vartype error_message: str + :ivar created_at: The creation time of the container. Required. + :vartype created_at: ~datetime.datetime + :ivar updated_at: The last update time of the container. Required. + :vartype updated_at: ~datetime.datetime """ - __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read"]) - """The type of credential used by the connection. Required. Known values are: \"ApiKey\", \"AAD\", - \"SAS\", \"CustomKeys\", and \"None\".""" + object: Literal["agent.container"] = rest_field(visibility=["read"]) + """The object type, which is always 'agent.container'. Required. Default value is + \"agent.container\".""" + status: Union[str, "_models.AgentContainerStatus"] = rest_field(visibility=["read"]) + """The status of the container of a specific version of an agent. Required. Known values are: + \"Starting\", \"Running\", \"Stopping\", \"Stopped\", \"Failed\", \"Deleting\", \"Deleted\", + and \"Updating\".""" + max_replicas: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The maximum number of replicas for the container. Default is 1.""" + min_replicas: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The minimum number of replicas for the container. Default is 1.""" + error_message: Optional[str] = rest_field(visibility=["read"]) + """The error message if the container failed to operate, if any.""" + created_at: datetime.datetime = rest_field(visibility=["read"], format="rfc3339") + """The creation time of the container. Required.""" + updated_at: datetime.datetime = rest_field(visibility=["read"], format="rfc3339") + """The last update time of the container. Required.""" @overload def __init__( self, *, - type: str, + max_replicas: Optional[int] = None, + min_replicas: Optional[int] = None, ) -> None: ... @overload @@ -313,25 +344,34 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.object: Literal["agent.container"] = "agent.container" -class ApiKeyCredentials(BaseCredentials, discriminator="ApiKey"): - """API Key Credential definition. +class AgentContainerOperationError(_Model): + """The error details of the container operation, if any. - :ivar type: The credential type. Required. API Key credential - :vartype type: str or ~azure.ai.projects.models.API_KEY - :ivar api_key: API Key. - :vartype api_key: str + :ivar code: The error code of the container operation, if any. Required. + :vartype code: str + :ivar type: The error type of the container operation, if any. Required. + :vartype type: str + :ivar message: The error message of the container operation, if any. Required. + :vartype message: str """ - type: Literal[CredentialType.API_KEY] = rest_discriminator(name="type", visibility=["read"]) # type: ignore - """The credential type. Required. API Key credential""" - api_key: Optional[str] = rest_field(name="key", visibility=["read"]) - """API Key.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error code of the container operation, if any. Required.""" + type: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error type of the container operation, if any. Required.""" + message: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error message of the container operation, if any. Required.""" @overload def __init__( self, + *, + code: str, + type: str, + message: str, ) -> None: ... @overload @@ -343,32 +383,57 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = CredentialType.API_KEY # type: ignore -class Message(_Model): - """Abstract base model representing a single message in a conversation. - - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - AssistantMessage, DeveloperMessage, SystemMessage, UserMessage +class AgentContainerOperationObject(_Model): + """The container operation for a specific version of an agent. - :ivar role: The role of the message author. Known values: 'system', 'assistant', 'developer', - 'user'. Required. Is one of the following types: Literal["system"], Literal["assistant"], - Literal["developer"], Literal["user"], str - :vartype role: str or str or str or str or str + :ivar id: The ID of the container operation. This id is unique identifier across the system. + Required. + :vartype id: str + :ivar agent_id: The ID of the agent. Required. + :vartype agent_id: str + :ivar agent_version_id: The ID of the agent version. Required. + :vartype agent_version_id: str + :ivar status: The status of the container operation. Required. Known values are: "NotStarted", + "InProgress", "Succeeded", and "Failed". + :vartype status: str or ~azure.ai.projects.models.AgentContainerOperationStatus + :ivar error: The error of the container operation, if any. + :vartype error: ~azure.ai.projects.models.AgentContainerOperationError + :ivar container: The container of the specific version of an agent. + :vartype container: ~azure.ai.projects.models.AgentContainerObject """ - __mapping__: dict[str, _Model] = {} - role: str = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) - """The role of the message author. Known values: 'system', 'assistant', 'developer', 'user'. - Required. Is one of the following types: Literal[\"system\"], Literal[\"assistant\"], - Literal[\"developer\"], Literal[\"user\"], str""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the container operation. This id is unique identifier across the system. Required.""" + agent_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the agent. Required.""" + agent_version_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the agent version. Required.""" + status: Union[str, "_models.AgentContainerOperationStatus"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the container operation. Required. Known values are: \"NotStarted\", + \"InProgress\", \"Succeeded\", and \"Failed\".""" + error: Optional["_models.AgentContainerOperationError"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The error of the container operation, if any.""" + container: Optional["_models.AgentContainerObject"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The container of the specific version of an agent.""" @overload def __init__( self, *, - role: str, + id: str, # pylint: disable=redefined-builtin + agent_id: str, + agent_version_id: str, + status: Union[str, "_models.AgentContainerOperationStatus"], + error: Optional["_models.AgentContainerOperationError"] = None, + container: Optional["_models.AgentContainerObject"] = None, ) -> None: ... @overload @@ -382,25 +447,30 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class AssistantMessage(Message, discriminator="assistant"): - """A message generated by the assistant in response to previous messages. +class AgentDefinition(_Model): + """AgentDefinition. - :ivar role: Indicates this is an assistant message. Required. Default value is "assistant". - :vartype role: str - :ivar content: Response content generated by the assistant. Required. - :vartype content: str + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ContainerAppAgentDefinition, HostedAgentDefinition, PromptAgentDefinition, WorkflowDefinition + + :ivar kind: Required. Known values are: "prompt", "hosted", "container_app", and "workflow". + :vartype kind: str or ~azure.ai.projects.models.AgentKind + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig """ - role: Literal["assistant"] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Indicates this is an assistant message. Required. Default value is \"assistant\".""" - content: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Response content generated by the assistant. Required.""" + __mapping__: dict[str, _Model] = {} + kind: str = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"prompt\", \"hosted\", \"container_app\", and \"workflow\".""" + rai_config: Optional["_models.RaiConfig"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Configuration for Responsible AI (RAI) content filtering and safety features.""" @overload def __init__( self, *, - content: str, + kind: str, + rai_config: Optional["_models.RaiConfig"] = None, ) -> None: ... @overload @@ -412,52 +482,30 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.role = "assistant" # type: ignore -class Index(_Model): - """Index resource Definition. +class BaseCredentials(_Model): + """A base class for connection credentials. You probably want to use the sub-classes and not this class directly. Known sub-classes are: - AzureAISearchIndex, CosmosDBIndex, ManagedAzureAISearchIndex + EntraIDCredentials, AgenticIdentityCredentials, ApiKeyCredentials, CustomCredential, + NoAuthenticationCredentials, SASCredentials - :ivar type: Type of index. Required. Known values are: "AzureSearch", - "CosmosDBNoSqlVectorStore", and "ManagedAzureSearch". - :vartype type: str or ~azure.ai.projects.models.IndexType - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] + :ivar type: The type of credential used by the connection. Required. Known values are: + "ApiKey", "AAD", "SAS", "CustomKeys", "None", and "AgenticIdentityToken". + :vartype type: str or ~azure.ai.projects.models.CredentialType """ __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """Type of index. Required. Known values are: \"AzureSearch\", \"CosmosDBNoSqlVectorStore\", and - \"ManagedAzureSearch\".""" - id: Optional[str] = rest_field(visibility=["read"]) - """Asset ID, a unique identifier for the asset.""" - name: str = rest_field(visibility=["read"]) - """The name of the resource. Required.""" - version: str = rest_field(visibility=["read"]) - """The version of the resource. Required.""" - description: Optional[str] = rest_field(visibility=["create", "update"]) - """The asset description text.""" - tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) - """Tag dictionary. Tags can be added, removed, and updated.""" + type: str = rest_discriminator(name="type", visibility=["read"]) + """The type of credential used by the connection. Required. Known values are: \"ApiKey\", \"AAD\", + \"SAS\", \"CustomKeys\", \"None\", and \"AgenticIdentityToken\".""" @overload def __init__( self, *, type: str, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, ) -> None: ... @overload @@ -471,47 +519,19 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class AzureAISearchIndex(Index, discriminator="AzureSearch"): - """Azure AI Search Index Definition. +class AgenticIdentityCredentials(BaseCredentials, discriminator="AgenticIdentityToken"): + """Agentic identity credential definition. - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - :ivar type: Type of index. Required. Azure search - :vartype type: str or ~azure.ai.projects.models.AZURE_SEARCH - :ivar connection_name: Name of connection to Azure AI Search. Required. - :vartype connection_name: str - :ivar index_name: Name of index in Azure AI Search resource to attach. Required. - :vartype index_name: str - :ivar field_mapping: Field mapping configuration. - :vartype field_mapping: ~azure.ai.projects.models.FieldMapping + :ivar type: The credential type. Required. Agentic identity credential + :vartype type: str or ~azure.ai.projects.models.AGENTIC_IDENTITY """ - type: Literal[IndexType.AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Type of index. Required. Azure search""" - connection_name: str = rest_field(name="connectionName", visibility=["create"]) - """Name of connection to Azure AI Search. Required.""" - index_name: str = rest_field(name="indexName", visibility=["create"]) - """Name of index in Azure AI Search resource to attach. Required.""" - field_mapping: Optional["_models.FieldMapping"] = rest_field(name="fieldMapping", visibility=["create"]) - """Field mapping configuration.""" + type: Literal[CredentialType.AGENTIC_IDENTITY] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. Agentic identity credential""" @overload def __init__( self, - *, - connection_name: str, - index_name: str, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, - field_mapping: Optional["_models.FieldMapping"] = None, ) -> None: ... @overload @@ -523,28 +543,33 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = IndexType.AZURE_SEARCH # type: ignore - + self.type = CredentialType.AGENTIC_IDENTITY # type: ignore -class TargetConfig(_Model): - """Abstract class for target configuration. - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - AzureOpenAIModelConfiguration +class AgentId(_Model): + """AgentId. - :ivar type: Type of the model configuration. Required. Default value is None. + :ivar type: Required. Default value is "agent_id". :vartype type: str + :ivar name: The name of the agent. Required. + :vartype name: str + :ivar version: The version identifier of the agent. Required. + :vartype version: str """ - __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """Type of the model configuration. Required. Default value is None.""" + type: Literal["agent_id"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required. Default value is \"agent_id\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Required.""" + version: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version identifier of the agent. Required.""" @overload def __init__( self, *, - type: str, + name: str, + version: str, ) -> None: ... @overload @@ -556,33 +581,38 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type: Literal["agent_id"] = "agent_id" -class AzureOpenAIModelConfiguration(TargetConfig, discriminator="AzureOpenAIModel"): - """Azure OpenAI model configuration. The API version would be selected by the service for querying - the model. +class AgentObject(_Model): + """AgentObject. - :ivar type: Required. Default value is "AzureOpenAIModel". - :vartype type: str - :ivar model_deployment_name: Deployment name for AOAI model. Example: gpt-4o if in AIServices - or connection based ``connection_name/deployment_name`` (e.g. ``my-aoai-connection/gpt-4o``). - Required. - :vartype model_deployment_name: str + :ivar object: The object type, which is always 'agent'. Required. Default value is "agent". + :vartype object: str + :ivar id: The unique identifier of the agent. Required. + :vartype id: str + :ivar name: The name of the agent. Required. + :vartype name: str + :ivar versions: The latest version of the agent. Required. + :vartype versions: ~azure.ai.projects.models.AgentObjectVersions """ - type: Literal["AzureOpenAIModel"] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Required. Default value is \"AzureOpenAIModel\".""" - model_deployment_name: str = rest_field( - name="modelDeploymentName", visibility=["read", "create", "update", "delete", "query"] - ) - """Deployment name for AOAI model. Example: gpt-4o if in AIServices or connection based - ``connection_name/deployment_name`` (e.g. ``my-aoai-connection/gpt-4o``). Required.""" + object: Literal["agent"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type, which is always 'agent'. Required. Default value is \"agent\".""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the agent. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Required.""" + versions: "_models.AgentObjectVersions" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The latest version of the agent. Required.""" @overload def __init__( self, *, - model_deployment_name: str, + id: str, # pylint: disable=redefined-builtin + name: str, + versions: "_models.AgentObjectVersions", ) -> None: ... @overload @@ -594,40 +624,24 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = "AzureOpenAIModel" # type: ignore + self.object: Literal["agent"] = "agent" -class BlobReference(_Model): - """Blob reference details. +class AgentObjectVersions(_Model): + """AgentObjectVersions. - :ivar blob_uri: Blob URI path for client to upload data. Example: - ``https://blob.windows.core.net/Container/Path``. Required. - :vartype blob_uri: str - :ivar storage_account_arm_id: ARM ID of the storage account to use. Required. - :vartype storage_account_arm_id: str - :ivar credential: Credential info to access the storage account. Required. - :vartype credential: ~azure.ai.projects.models.BlobReferenceSasCredential + :ivar latest: Required. + :vartype latest: ~azure.ai.projects.models.AgentVersionObject """ - blob_uri: str = rest_field(name="blobUri", visibility=["read", "create", "update", "delete", "query"]) - """Blob URI path for client to upload data. Example: - ``https://blob.windows.core.net/Container/Path``. Required.""" - storage_account_arm_id: str = rest_field( - name="storageAccountArmId", visibility=["read", "create", "update", "delete", "query"] - ) - """ARM ID of the storage account to use. Required.""" - credential: "_models.BlobReferenceSasCredential" = rest_field( - visibility=["read", "create", "update", "delete", "query"] - ) - """Credential info to access the storage account. Required.""" + latest: "_models.AgentVersionObject" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" @overload def __init__( self, *, - blob_uri: str, - storage_account_arm_id: str, - credential: "_models.BlobReferenceSasCredential", + latest: "_models.AgentVersionObject", ) -> None: ... @overload @@ -641,118 +655,13289 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class BlobReferenceSasCredential(_Model): - """SAS Credential definition. +class AgentReference(_Model): + """AgentReference. - :ivar sas_uri: SAS uri. Required. - :vartype sas_uri: str - :ivar type: Type of credential. Required. Default value is "SAS". + :ivar type: Required. Default value is "agent_reference". :vartype type: str + :ivar name: The name of the agent. Required. + :vartype name: str + :ivar version: The version identifier of the agent. + :vartype version: str + """ + + type: Literal["agent_reference"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required. Default value is \"agent_reference\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Required.""" + version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version identifier of the agent.""" + + @overload + def __init__( + self, + *, + name: str, + version: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["agent_reference"] = "agent_reference" + + +class EvaluationTaxonomyInput(_Model): + """Input configuration for the evaluation taxonomy. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AgentTaxonomyInput + + :ivar type: Input type of the evaluation taxonomy. Required. Known values are: "agent" and + "policy". + :vartype type: str or ~azure.ai.projects.models.EvaluationTaxonomyInputType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Input type of the evaluation taxonomy. Required. Known values are: \"agent\" and \"policy\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AgentTaxonomyInput(EvaluationTaxonomyInput, discriminator="agent"): + """Input configuration for the evaluation taxonomy when the input type is agent. + + :ivar type: Input type of the evaluation taxonomy. Required. Agent + :vartype type: str or ~azure.ai.projects.models.AGENT + :ivar target: Target configuration for the agent. Required. + :vartype target: ~azure.ai.projects.models.AzureAIAgentTarget + :ivar risk_categories: List of risk categories to evaluate against. Required. + :vartype risk_categories: list[str or ~azure.ai.projects.models.RiskCategory] + """ + + type: Literal[EvaluationTaxonomyInputType.AGENT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Input type of the evaluation taxonomy. Required. Agent""" + target: "_models.AzureAIAgentTarget" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Target configuration for the agent. Required.""" + risk_categories: list[Union[str, "_models.RiskCategory"]] = rest_field( + name="riskCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of risk categories to evaluate against. Required.""" + + @overload + def __init__( + self, + *, + target: "_models.AzureAIAgentTarget", + risk_categories: list[Union[str, "_models.RiskCategory"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = EvaluationTaxonomyInputType.AGENT # type: ignore + + +class AgentVersionObject(_Model): + """AgentVersionObject. + + :ivar metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Required. + :vartype metadata: dict[str, str] + :ivar object: The object type, which is always 'agent.version'. Required. Default value is + "agent.version". + :vartype object: str + :ivar id: The unique identifier of the agent version. Required. + :vartype id: str + :ivar name: The name of the agent. Name can be used to retrieve/update/delete the agent. + Required. + :vartype name: str + :ivar version: The version identifier of the agent. Agents are immutable and every update + creates a new version while keeping the name same. Required. + :vartype version: str + :ivar description: A human-readable description of the agent. + :vartype description: str + :ivar created_at: The Unix timestamp (seconds) when the agent was created. Required. + :vartype created_at: ~datetime.datetime + :ivar definition: Required. + :vartype definition: ~azure.ai.projects.models.AgentDefinition + """ + + metadata: dict[str, str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Required.""" + object: Literal["agent.version"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type, which is always 'agent.version'. Required. Default value is \"agent.version\".""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the agent version. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Name can be used to retrieve/update/delete the agent. Required.""" + version: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version identifier of the agent. Agents are immutable and every update creates a new + version while keeping the name same. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A human-readable description of the agent.""" + created_at: datetime.datetime = rest_field( + visibility=["read", "create", "update", "delete", "query"], format="unix-timestamp" + ) + """The Unix timestamp (seconds) when the agent was created. Required.""" + definition: "_models.AgentDefinition" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + metadata: dict[str, str], + id: str, # pylint: disable=redefined-builtin + name: str, + version: str, + created_at: datetime.datetime, + definition: "_models.AgentDefinition", + description: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["agent.version"] = "agent.version" + + +class AISearchIndexResource(_Model): + """A AI Search Index resource. + + :ivar project_connection_id: An index connection ID in an IndexResource attached to this agent. + Required. + :vartype project_connection_id: str + :ivar index_name: The name of an index in an IndexResource attached to this agent. + :vartype index_name: str + :ivar query_type: Type of query in an AIIndexResource attached to this agent. Known values are: + "simple", "semantic", "vector", "vector_simple_hybrid", and "vector_semantic_hybrid". + :vartype query_type: str or ~azure.ai.projects.models.AzureAISearchQueryType + :ivar top_k: Number of documents to retrieve from search and present to the model. + :vartype top_k: int + :ivar filter: filter string for search resource. `Learn more here + `_. + :vartype filter: str + :ivar index_asset_id: Index asset id for search resource. + :vartype index_asset_id: str + """ + + project_connection_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An index connection ID in an IndexResource attached to this agent. Required.""" + index_name: Optional[str] = rest_field(name="indexName", visibility=["read", "create", "update", "delete", "query"]) + """The name of an index in an IndexResource attached to this agent.""" + query_type: Optional[Union[str, "_models.AzureAISearchQueryType"]] = rest_field( + name="queryType", visibility=["read", "create", "update", "delete", "query"] + ) + """Type of query in an AIIndexResource attached to this agent. Known values are: \"simple\", + \"semantic\", \"vector\", \"vector_simple_hybrid\", and \"vector_semantic_hybrid\".""" + top_k: Optional[int] = rest_field(name="topK", visibility=["read", "create", "update", "delete", "query"]) + """Number of documents to retrieve from search and present to the model.""" + filter: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """filter string for search resource. `Learn more here + `_.""" + index_asset_id: Optional[str] = rest_field( + name="indexAssetId", visibility=["read", "create", "update", "delete", "query"] + ) + """Index asset id for search resource.""" + + @overload + def __init__( + self, + *, + project_connection_id: str, + index_name: Optional[str] = None, + query_type: Optional[Union[str, "_models.AzureAISearchQueryType"]] = None, + top_k: Optional[int] = None, + filter: Optional[str] = None, # pylint: disable=redefined-builtin + index_asset_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Annotation(_Model): + """Annotation. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AnnotationFileCitation, AnnotationFilePath, AnnotationUrlCitation + + :ivar type: Required. Known values are: "file_citation", "url_citation", "file_path", and + "container_file_citation". + :vartype type: str or ~azure.ai.projects.models.AnnotationType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"file_citation\", \"url_citation\", \"file_path\", and + \"container_file_citation\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AnnotationFileCitation(Annotation, discriminator="file_citation"): + """A citation to a file. + + :ivar type: The type of the file citation. Always ``file_citation``. Required. + :vartype type: str or ~azure.ai.projects.models.FILE_CITATION + :ivar file_id: The ID of the file. Required. + :vartype file_id: str + :ivar index: The index of the file in the list of files. Required. + :vartype index: int + :ivar filename: The filename of the file cited. Required. + :vartype filename: str + """ + + type: Literal[AnnotationType.FILE_CITATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the file citation. Always ``file_citation``. Required.""" + file_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the file. Required.""" + index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the file in the list of files. Required.""" + filename: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The filename of the file cited. Required.""" + + @overload + def __init__( + self, + *, + file_id: str, + index: int, + filename: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = AnnotationType.FILE_CITATION # type: ignore + + +class AnnotationFilePath(Annotation, discriminator="file_path"): + """A path to a file. + + :ivar type: The type of the file path. Always ``file_path``. Required. + :vartype type: str or ~azure.ai.projects.models.FILE_PATH + :ivar file_id: The ID of the file. Required. + :vartype file_id: str + :ivar index: The index of the file in the list of files. Required. + :vartype index: int + """ + + type: Literal[AnnotationType.FILE_PATH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the file path. Always ``file_path``. Required.""" + file_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the file. Required.""" + index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the file in the list of files. Required.""" + + @overload + def __init__( + self, + *, + file_id: str, + index: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = AnnotationType.FILE_PATH # type: ignore + + +class AnnotationUrlCitation(Annotation, discriminator="url_citation"): + """A citation for a web resource used to generate a model response. + + :ivar type: The type of the URL citation. Always ``url_citation``. Required. + :vartype type: str or ~azure.ai.projects.models.URL_CITATION + :ivar url: The URL of the web resource. Required. + :vartype url: str + :ivar start_index: The index of the first character of the URL citation in the message. + Required. + :vartype start_index: int + :ivar end_index: The index of the last character of the URL citation in the message. Required. + :vartype end_index: int + :ivar title: The title of the web resource. Required. + :vartype title: str + """ + + type: Literal[AnnotationType.URL_CITATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the URL citation. Always ``url_citation``. Required.""" + url: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL of the web resource. Required.""" + start_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the first character of the URL citation in the message. Required.""" + end_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the last character of the URL citation in the message. Required.""" + title: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The title of the web resource. Required.""" + + @overload + def __init__( + self, + *, + url: str, + start_index: int, + end_index: int, + title: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = AnnotationType.URL_CITATION # type: ignore + + +class ApiError(_Model): + """ApiError. + + :ivar code: The error code. Required. + :vartype code: str + :ivar message: A human-readable description of the error. Required. + :vartype message: str + :ivar target: The target of the error, if applicable. + :vartype target: str + :ivar details: Additional details about the error. Required. + :vartype details: list[~azure.ai.projects.models.ApiError] + :ivar innererror: The inner error, if any. + :vartype innererror: ~azure.ai.projects.models.ApiInnerError + """ + + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error code. Required.""" + message: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A human-readable description of the error. Required.""" + target: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The target of the error, if applicable.""" + details: list["_models.ApiError"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Additional details about the error. Required.""" + innererror: Optional["_models.ApiInnerError"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The inner error, if any.""" + + @overload + def __init__( + self, + *, + code: str, + message: str, + details: list["_models.ApiError"], + target: Optional[str] = None, + innererror: Optional["_models.ApiInnerError"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApiErrorResponse(_Model): + """Error response for API failures. + + :ivar error: Required. + :vartype error: ~azure.ai.projects.models.ApiError + """ + + error: "_models.ApiError" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + error: "_models.ApiError", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApiInnerError(_Model): + """ApiInnerError. + + :ivar code: The error code. Required. + :vartype code: str + :ivar innererror: The inner error, if any. + :vartype innererror: ~azure.ai.projects.models.ApiInnerError + """ + + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error code. Required.""" + innererror: Optional["_models.ApiInnerError"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The inner error, if any.""" + + @overload + def __init__( + self, + *, + code: str, + innererror: Optional["_models.ApiInnerError"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApiKeyCredentials(BaseCredentials, discriminator="ApiKey"): + """API Key Credential definition. + + :ivar type: The credential type. Required. API Key credential + :vartype type: str or ~azure.ai.projects.models.API_KEY + :ivar api_key: API Key. + :vartype api_key: str + """ + + type: Literal[CredentialType.API_KEY] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. API Key credential""" + api_key: Optional[str] = rest_field(name="key", visibility=["read"]) + """API Key.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CredentialType.API_KEY # type: ignore + + +class Location(_Model): + """Location. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ApproximateLocation + + :ivar type: Required. "approximate" + :vartype type: str or ~azure.ai.projects.models.LocationType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. \"approximate\"""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApproximateLocation(Location, discriminator="approximate"): + """ApproximateLocation. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.APPROXIMATE + :ivar country: + :vartype country: str + :ivar region: + :vartype region: str + :ivar city: + :vartype city: str + :ivar timezone: + :vartype timezone: str + """ + + type: Literal[LocationType.APPROXIMATE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + country: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + region: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + city: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + timezone: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + + @overload + def __init__( + self, + *, + country: Optional[str] = None, + region: Optional[str] = None, + city: Optional[str] = None, + timezone: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = LocationType.APPROXIMATE # type: ignore + + +class Target(_Model): + """Base class for targets with discriminator support. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AzureAIAgentTarget, AzureAIAssistantTarget, AzureAIModelTarget + + :ivar type: The type of target. Required. Default value is None. + :vartype type: str + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of target. Required. Default value is None.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureAIAgentTarget(Target, discriminator="azure_ai_agent"): + """Represents a target specifying an Azure AI agent. + + :ivar type: The type of target, always ``azure_ai_agent``. Required. Default value is + "azure_ai_agent". + :vartype type: str + :ivar name: The unique identifier of the Azure AI agent. Required. + :vartype name: str + :ivar version: The version of the Azure AI agent. + :vartype version: str + :ivar tool_descriptions: The parameters used to control the sampling behavior of the agent + during text generation. + :vartype tool_descriptions: list[~azure.ai.projects.models.ToolDescription] + """ + + type: Literal["azure_ai_agent"] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of target, always ``azure_ai_agent``. Required. Default value is \"azure_ai_agent\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the Azure AI agent. Required.""" + version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version of the Azure AI agent.""" + tool_descriptions: Optional[list["_models.ToolDescription"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The parameters used to control the sampling behavior of the agent during text generation.""" + + @overload + def __init__( + self, + *, + name: str, + version: Optional[str] = None, + tool_descriptions: Optional[list["_models.ToolDescription"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = "azure_ai_agent" # type: ignore + + +class AzureAISearchAgentTool(Tool, discriminator="azure_ai_search"): + """The input definition information for an Azure AI search tool as used to configure an agent. + + :ivar type: The object type, which is always 'azure_ai_search'. Required. + :vartype type: str or ~azure.ai.projects.models.AZURE_AI_SEARCH + :ivar azure_ai_search: The azure ai search index resource. Required. + :vartype azure_ai_search: ~azure.ai.projects.models.AzureAISearchToolResource + """ + + type: Literal[ToolType.AZURE_AI_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'azure_ai_search'. Required.""" + azure_ai_search: "_models.AzureAISearchToolResource" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The azure ai search index resource. Required.""" + + @overload + def __init__( + self, + *, + azure_ai_search: "_models.AzureAISearchToolResource", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.AZURE_AI_SEARCH # type: ignore + + +class Index(_Model): + """Index resource Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AzureAISearchIndex, CosmosDBIndex, ManagedAzureAISearchIndex + + :ivar type: Type of index. Required. Known values are: "AzureSearch", + "CosmosDBNoSqlVectorStore", and "ManagedAzureSearch". + :vartype type: str or ~azure.ai.projects.models.IndexType + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of index. Required. Known values are: \"AzureSearch\", \"CosmosDBNoSqlVectorStore\", and + \"ManagedAzureSearch\".""" + id: Optional[str] = rest_field(visibility=["read"]) + """Asset ID, a unique identifier for the asset.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["create", "update"]) + """The asset description text.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + type: str, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureAISearchIndex(Index, discriminator="AzureSearch"): + """Azure AI Search Index Definition. + + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. Azure search + :vartype type: str or ~azure.ai.projects.models.AZURE_SEARCH + :ivar connection_name: Name of connection to Azure AI Search. Required. + :vartype connection_name: str + :ivar index_name: Name of index in Azure AI Search resource to attach. Required. + :vartype index_name: str + :ivar field_mapping: Field mapping configuration. + :vartype field_mapping: ~azure.ai.projects.models.FieldMapping + """ + + type: Literal[IndexType.AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. Azure search""" + connection_name: str = rest_field(name="connectionName", visibility=["create"]) + """Name of connection to Azure AI Search. Required.""" + index_name: str = rest_field(name="indexName", visibility=["create"]) + """Name of index in Azure AI Search resource to attach. Required.""" + field_mapping: Optional["_models.FieldMapping"] = rest_field(name="fieldMapping", visibility=["create"]) + """Field mapping configuration.""" + + @overload + def __init__( + self, + *, + connection_name: str, + index_name: str, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + field_mapping: Optional["_models.FieldMapping"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = IndexType.AZURE_SEARCH # type: ignore + + +class AzureAISearchToolResource(_Model): + """A set of index resources used by the ``azure_ai_search`` tool. + + :ivar indexes: The indices attached to this agent. There can be a maximum of 1 index + resource attached to the agent. + :vartype indexes: list[~azure.ai.projects.models.AISearchIndexResource] + """ + + indexes: Optional[list["_models.AISearchIndexResource"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The indices attached to this agent. There can be a maximum of 1 index + resource attached to the agent.""" + + @overload + def __init__( + self, + *, + indexes: Optional[list["_models.AISearchIndexResource"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureFunctionAgentTool(Tool, discriminator="azure_function"): + """The input definition information for an Azure Function Tool, as used to configure an Agent. + + :ivar type: The object type, which is always 'browser_automation'. Required. + :vartype type: str or ~azure.ai.projects.models.AZURE_FUNCTION + :ivar azure_function: The Azure Function Tool definition. Required. + :vartype azure_function: ~azure.ai.projects.models.AzureFunctionDefinition + """ + + type: Literal[ToolType.AZURE_FUNCTION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'browser_automation'. Required.""" + azure_function: "_models.AzureFunctionDefinition" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The Azure Function Tool definition. Required.""" + + @overload + def __init__( + self, + *, + azure_function: "_models.AzureFunctionDefinition", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.AZURE_FUNCTION # type: ignore + + +class AzureFunctionBinding(_Model): + """The structure for keeping storage queue name and URI. + + :ivar type: The type of binding, which is always 'storage_queue'. Required. Default value is + "storage_queue". + :vartype type: str + :ivar storage_queue: Storage queue. Required. + :vartype storage_queue: ~azure.ai.projects.models.AzureFunctionStorageQueue + """ + + type: Literal["storage_queue"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The type of binding, which is always 'storage_queue'. Required. Default value is + \"storage_queue\".""" + storage_queue: "_models.AzureFunctionStorageQueue" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Storage queue. Required.""" + + @overload + def __init__( + self, + *, + storage_queue: "_models.AzureFunctionStorageQueue", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["storage_queue"] = "storage_queue" + + +class AzureFunctionDefinition(_Model): + """The definition of Azure function. + + :ivar function: The definition of azure function and its parameters. Required. + :vartype function: ~azure.ai.projects.models.AzureFunctionDefinitionFunction + :ivar input_binding: Input storage queue. The queue storage trigger runs a function as messages + are added to it. Required. + :vartype input_binding: ~azure.ai.projects.models.AzureFunctionBinding + :ivar output_binding: Output storage queue. The function writes output to this queue when the + input items are processed. Required. + :vartype output_binding: ~azure.ai.projects.models.AzureFunctionBinding + """ + + function: "_models.AzureFunctionDefinitionFunction" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The definition of azure function and its parameters. Required.""" + input_binding: "_models.AzureFunctionBinding" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Input storage queue. The queue storage trigger runs a function as messages are added to it. + Required.""" + output_binding: "_models.AzureFunctionBinding" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Output storage queue. The function writes output to this queue when the input items are + processed. Required.""" + + @overload + def __init__( + self, + *, + function: "_models.AzureFunctionDefinitionFunction", + input_binding: "_models.AzureFunctionBinding", + output_binding: "_models.AzureFunctionBinding", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureFunctionDefinitionFunction(_Model): + """AzureFunctionDefinitionFunction. + + :ivar name: The name of the function to be called. Required. + :vartype name: str + :ivar description: A description of what the function does, used by the model to choose when + and how to call the function. + :vartype description: str + :ivar parameters: The parameters the functions accepts, described as a JSON Schema object. + Required. + :vartype parameters: any + """ + + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to be called. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of what the function does, used by the model to choose when and how to call the + function.""" + parameters: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The parameters the functions accepts, described as a JSON Schema object. Required.""" + + @overload + def __init__( + self, + *, + name: str, + parameters: Any, + description: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureFunctionStorageQueue(_Model): + """The structure for keeping storage queue name and URI. + + :ivar queue_service_endpoint: URI to the Azure Storage Queue service allowing you to manipulate + a queue. Required. + :vartype queue_service_endpoint: str + :ivar queue_name: The name of an Azure function storage queue. Required. + :vartype queue_name: str + """ + + queue_service_endpoint: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """URI to the Azure Storage Queue service allowing you to manipulate a queue. Required.""" + queue_name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of an Azure function storage queue. Required.""" + + @overload + def __init__( + self, + *, + queue_service_endpoint: str, + queue_name: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class TargetConfig(_Model): + """Abstract class for target configuration. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AzureOpenAIModelConfiguration + + :ivar type: Type of the model configuration. Required. Default value is None. + :vartype type: str + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the model configuration. Required. Default value is None.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureOpenAIModelConfiguration(TargetConfig, discriminator="AzureOpenAIModel"): + """Azure OpenAI model configuration. The API version would be selected by the service for querying + the model. + + :ivar type: Required. Default value is "AzureOpenAIModel". + :vartype type: str + :ivar model_deployment_name: Deployment name for AOAI model. Example: gpt-4o if in AIServices + or connection based ``connection_name/deployment_name`` (e.g. ``my-aoai-connection/gpt-4o``). + Required. + :vartype model_deployment_name: str + """ + + type: Literal["AzureOpenAIModel"] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Default value is \"AzureOpenAIModel\".""" + model_deployment_name: str = rest_field( + name="modelDeploymentName", visibility=["read", "create", "update", "delete", "query"] + ) + """Deployment name for AOAI model. Example: gpt-4o if in AIServices or connection based + ``connection_name/deployment_name`` (e.g. ``my-aoai-connection/gpt-4o``). Required.""" + + @overload + def __init__( + self, + *, + model_deployment_name: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = "AzureOpenAIModel" # type: ignore + + +class BingCustomSearchAgentTool(Tool, discriminator="bing_custom_search_preview"): + """The input definition information for a Bing custom search tool as used to configure an agent. + + :ivar type: The object type, which is always 'bing_custom_search'. Required. + :vartype type: str or ~azure.ai.projects.models.BING_CUSTOM_SEARCH_PREVIEW + :ivar bing_custom_search_preview: The bing custom search tool parameters. Required. + :vartype bing_custom_search_preview: ~azure.ai.projects.models.BingCustomSearchToolParameters + """ + + type: Literal[ToolType.BING_CUSTOM_SEARCH_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'bing_custom_search'. Required.""" + bing_custom_search_preview: "_models.BingCustomSearchToolParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The bing custom search tool parameters. Required.""" + + @overload + def __init__( + self, + *, + bing_custom_search_preview: "_models.BingCustomSearchToolParameters", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.BING_CUSTOM_SEARCH_PREVIEW # type: ignore + + +class BingCustomSearchConfiguration(_Model): + """A bing custom search configuration. + + :ivar project_connection_id: Project connection id for grounding with bing search. Required. + :vartype project_connection_id: str + :ivar instance_name: Name of the custom configuration instance given to config. Required. + :vartype instance_name: str + :ivar market: The market where the results come from. + :vartype market: str + :ivar set_lang: The language to use for user interface strings when calling Bing API. + :vartype set_lang: str + :ivar count: The number of search results to return in the bing api response. + :vartype count: int + :ivar freshness: Filter search results by a specific time range. See `accepted values here + `_. + :vartype freshness: str + """ + + project_connection_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Project connection id for grounding with bing search. Required.""" + instance_name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Name of the custom configuration instance given to config. Required.""" + market: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The market where the results come from.""" + set_lang: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The language to use for user interface strings when calling Bing API.""" + count: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of search results to return in the bing api response.""" + freshness: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Filter search results by a specific time range. See `accepted values here + `_.""" + + @overload + def __init__( + self, + *, + project_connection_id: str, + instance_name: str, + market: Optional[str] = None, + set_lang: Optional[str] = None, + count: Optional[int] = None, + freshness: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BingCustomSearchToolParameters(_Model): + """The bing custom search tool parameters. + + :ivar search_configurations: The project connections attached to this tool. There can be a + maximum of 1 connection + resource attached to the tool. Required. + :vartype search_configurations: list[~azure.ai.projects.models.BingCustomSearchConfiguration] + """ + + search_configurations: list["_models.BingCustomSearchConfiguration"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The project connections attached to this tool. There can be a maximum of 1 connection + resource attached to the tool. Required.""" + + @overload + def __init__( + self, + *, + search_configurations: list["_models.BingCustomSearchConfiguration"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BingGroundingAgentTool(Tool, discriminator="bing_grounding"): + """The input definition information for a bing grounding search tool as used to configure an + agent. + + :ivar type: The object type, which is always 'bing_grounding'. Required. + :vartype type: str or ~azure.ai.projects.models.BING_GROUNDING + :ivar bing_grounding: The bing grounding search tool parameters. Required. + :vartype bing_grounding: ~azure.ai.projects.models.BingGroundingSearchToolParameters + """ + + type: Literal[ToolType.BING_GROUNDING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'bing_grounding'. Required.""" + bing_grounding: "_models.BingGroundingSearchToolParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The bing grounding search tool parameters. Required.""" + + @overload + def __init__( + self, + *, + bing_grounding: "_models.BingGroundingSearchToolParameters", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.BING_GROUNDING # type: ignore + + +class BingGroundingSearchConfiguration(_Model): + """Search configuration for Bing Grounding. + + :ivar project_connection_id: Project connection id for grounding with bing search. Required. + :vartype project_connection_id: str + :ivar market: The market where the results come from. + :vartype market: str + :ivar set_lang: The language to use for user interface strings when calling Bing API. + :vartype set_lang: str + :ivar count: The number of search results to return in the bing api response. + :vartype count: int + :ivar freshness: Filter search results by a specific time range. See `accepted values here + `_. + :vartype freshness: str + """ + + project_connection_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Project connection id for grounding with bing search. Required.""" + market: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The market where the results come from.""" + set_lang: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The language to use for user interface strings when calling Bing API.""" + count: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of search results to return in the bing api response.""" + freshness: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Filter search results by a specific time range. See `accepted values here + `_.""" + + @overload + def __init__( + self, + *, + project_connection_id: str, + market: Optional[str] = None, + set_lang: Optional[str] = None, + count: Optional[int] = None, + freshness: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BingGroundingSearchToolParameters(_Model): + """The bing grounding search tool parameters. + + :ivar project_connections: The project connections attached to this tool. There can be a + maximum of 1 connection + resource attached to the tool. Required. + :vartype project_connections: ~azure.ai.projects.models.ToolProjectConnectionList + :ivar search_configurations: The search configurations attached to this tool. There can be a + maximum of 1 + search configuration resource attached to the tool. Required. + :vartype search_configurations: + list[~azure.ai.projects.models.BingGroundingSearchConfiguration] + """ + + project_connections: "_models.ToolProjectConnectionList" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The project connections attached to this tool. There can be a maximum of 1 connection + resource attached to the tool. Required.""" + search_configurations: list["_models.BingGroundingSearchConfiguration"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The search configurations attached to this tool. There can be a maximum of 1 + search configuration resource attached to the tool. Required.""" + + @overload + def __init__( + self, + *, + project_connections: "_models.ToolProjectConnectionList", + search_configurations: list["_models.BingGroundingSearchConfiguration"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BlobReference(_Model): + """Blob reference details. + + :ivar blob_uri: Blob URI path for client to upload data. Example: + ``https://blob.windows.core.net/Container/Path``. Required. + :vartype blob_uri: str + :ivar storage_account_arm_id: ARM ID of the storage account to use. Required. + :vartype storage_account_arm_id: str + :ivar credential: Credential info to access the storage account. Required. + :vartype credential: ~azure.ai.projects.models.BlobReferenceSasCredential + """ + + blob_uri: str = rest_field(name="blobUri", visibility=["read", "create", "update", "delete", "query"]) + """Blob URI path for client to upload data. Example: + ``https://blob.windows.core.net/Container/Path``. Required.""" + storage_account_arm_id: str = rest_field( + name="storageAccountArmId", visibility=["read", "create", "update", "delete", "query"] + ) + """ARM ID of the storage account to use. Required.""" + credential: "_models.BlobReferenceSasCredential" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Credential info to access the storage account. Required.""" + + @overload + def __init__( + self, + *, + blob_uri: str, + storage_account_arm_id: str, + credential: "_models.BlobReferenceSasCredential", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BlobReferenceSasCredential(_Model): + """SAS Credential definition. + + :ivar sas_uri: SAS uri. Required. + :vartype sas_uri: str + :ivar type: Type of credential. Required. Default value is "SAS". + :vartype type: str + """ + + sas_uri: str = rest_field(name="sasUri", visibility=["read"]) + """SAS uri. Required.""" + type: Literal["SAS"] = rest_field(visibility=["read"]) + """Type of credential. Required. Default value is \"SAS\".""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["SAS"] = "SAS" + + +class BrowserAutomationAgentTool(Tool, discriminator="browser_automation_preview"): + """The input definition information for a Browser Automation Tool, as used to configure an Agent. + + :ivar type: The object type, which is always 'browser_automation'. Required. + :vartype type: str or ~azure.ai.projects.models.BROWSER_AUTOMATION_PREVIEW + :ivar browser_automation_preview: The Browser Automation Tool parameters. Required. + :vartype browser_automation_preview: ~azure.ai.projects.models.BrowserAutomationToolParameters + """ + + type: Literal[ToolType.BROWSER_AUTOMATION_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'browser_automation'. Required.""" + browser_automation_preview: "_models.BrowserAutomationToolParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The Browser Automation Tool parameters. Required.""" + + @overload + def __init__( + self, + *, + browser_automation_preview: "_models.BrowserAutomationToolParameters", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.BROWSER_AUTOMATION_PREVIEW # type: ignore + + +class BrowserAutomationToolConnectionParameters(_Model): # pylint: disable=name-too-long + """Definition of input parameters for the connection used by the Browser Automation Tool. + + :ivar id: The ID of the project connection to your Azure Playwright resource. Required. + :vartype id: str + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the project connection to your Azure Playwright resource. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class BrowserAutomationToolParameters(_Model): + """Definition of input parameters for the Browser Automation Tool. + + :ivar project_connection: The project connection parameters associated with the Browser + Automation Tool. Required. + :vartype project_connection: + ~azure.ai.projects.models.BrowserAutomationToolConnectionParameters + """ + + project_connection: "_models.BrowserAutomationToolConnectionParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The project connection parameters associated with the Browser Automation Tool. Required.""" + + @overload + def __init__( + self, + *, + project_connection: "_models.BrowserAutomationToolConnectionParameters", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CaptureStructuredOutputsTool(Tool, discriminator="capture_structured_outputs"): + """A tool for capturing structured outputs. + + :ivar type: The type of the tool. Always ``capture_structured_outputs``. Required. + :vartype type: str or ~azure.ai.projects.models.CAPTURE_STRUCTURED_OUTPUTS + :ivar outputs: The structured outputs to capture from the model. Required. + :vartype outputs: ~azure.ai.projects.models.StructuredOutputDefinition + """ + + type: Literal[ToolType.CAPTURE_STRUCTURED_OUTPUTS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the tool. Always ``capture_structured_outputs``. Required.""" + outputs: "_models.StructuredOutputDefinition" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The structured outputs to capture from the model. Required.""" + + @overload + def __init__( + self, + *, + outputs: "_models.StructuredOutputDefinition", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.CAPTURE_STRUCTURED_OUTPUTS # type: ignore + + +class ChartCoordinate(_Model): + """Coordinates for the analysis chart. + + :ivar x: X-axis coordinate. Required. + :vartype x: int + :ivar y: Y-axis coordinate. Required. + :vartype y: int + :ivar size: Size of the chart element. Required. + :vartype size: int + """ + + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """X-axis coordinate. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Y-axis coordinate. Required.""" + size: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Size of the chart element. Required.""" + + @overload + def __init__( + self, + *, + x: int, + y: int, + size: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryItem(_Model): + """A single memory item stored in the memory store, containing content and metadata. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ChatSummaryMemoryItem, UserProfileMemoryItem + + :ivar memory_id: The unique ID of the memory item. Required. + :vartype memory_id: str + :ivar updated_at: The last update time of the memory item. Required. + :vartype updated_at: ~datetime.datetime + :ivar scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :vartype scope: str + :ivar content: The content of the memory. Required. + :vartype content: str + :ivar kind: The kind of the memory item. Required. Known values are: "user_profile" and + "chat_summary". + :vartype kind: str or ~azure.ai.projects.models.MemoryItemKind + """ + + __mapping__: dict[str, _Model] = {} + memory_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the memory item. Required.""" + updated_at: datetime.datetime = rest_field( + visibility=["read", "create", "update", "delete", "query"], format="unix-timestamp" + ) + """The last update time of the memory item. Required.""" + scope: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The namespace that logically groups and isolates memories, such as a user ID. Required.""" + content: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content of the memory. Required.""" + kind: str = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) + """The kind of the memory item. Required. Known values are: \"user_profile\" and \"chat_summary\".""" + + @overload + def __init__( + self, + *, + memory_id: str, + updated_at: datetime.datetime, + scope: str, + content: str, + kind: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ChatSummaryMemoryItem(MemoryItem, discriminator="chat_summary"): + """A memory item containing a summary extracted from conversations. + + :ivar memory_id: The unique ID of the memory item. Required. + :vartype memory_id: str + :ivar updated_at: The last update time of the memory item. Required. + :vartype updated_at: ~datetime.datetime + :ivar scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :vartype scope: str + :ivar content: The content of the memory. Required. + :vartype content: str + :ivar kind: The kind of the memory item. Required. Summary of chat conversations. + :vartype kind: str or ~azure.ai.projects.models.CHAT_SUMMARY + """ + + kind: Literal[MemoryItemKind.CHAT_SUMMARY] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The kind of the memory item. Required. Summary of chat conversations.""" + + @overload + def __init__( + self, + *, + memory_id: str, + updated_at: datetime.datetime, + scope: str, + content: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = MemoryItemKind.CHAT_SUMMARY # type: ignore + + +class ClusterInsightResult(_Model): + """Insights from the cluster analysis. + + :ivar summary: Summary of the insights report. Required. + :vartype summary: ~azure.ai.projects.models.InsightSummary + :ivar clusters: List of clusters identified in the insights. Required. + :vartype clusters: list[~azure.ai.projects.models.InsightCluster] + :ivar coordinates: Optional mapping of IDs to 2D coordinates used by the UX for + visualization. + + The map keys are string identifiers (for example, a cluster id or a sample id) + and the values are the coordinates and visual size for rendering on a 2D chart. + + This property is omitted unless the client requests coordinates (for example, + by passing ``includeCoordinates=true`` as a query parameter). + + Example: + + .. code-block:: + + { + "cluster-1": { "x": 12, "y": 34, "size": 8 }, + "sample-123": { "x": 18, "y": 22, "size": 4 } + } + + Coordinates are intended only for client-side visualization and do not + modify the canonical insights results. + :vartype coordinates: dict[str, ~azure.ai.projects.models.ChartCoordinate] + """ + + summary: "_models.InsightSummary" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Summary of the insights report. Required.""" + clusters: list["_models.InsightCluster"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of clusters identified in the insights. Required.""" + coordinates: Optional[dict[str, "_models.ChartCoordinate"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """ Optional mapping of IDs to 2D coordinates used by the UX for visualization. + + The map keys are string identifiers (for example, a cluster id or a sample id) + and the values are the coordinates and visual size for rendering on a 2D chart. + + This property is omitted unless the client requests coordinates (for example, + by passing ``includeCoordinates=true`` as a query parameter). + + Example: + + .. code-block:: + + { + \"cluster-1\": { \"x\": 12, \"y\": 34, \"size\": 8 }, + \"sample-123\": { \"x\": 18, \"y\": 22, \"size\": 4 } + } + + Coordinates are intended only for client-side visualization and do not + modify the canonical insights results.""" + + @overload + def __init__( + self, + *, + summary: "_models.InsightSummary", + clusters: list["_models.InsightCluster"], + coordinates: Optional[dict[str, "_models.ChartCoordinate"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ClusterTokenUsage(_Model): + """Token usage for cluster analysis. + + :ivar input_token_usage: input token usage. Required. + :vartype input_token_usage: int + :ivar output_token_usage: output token usage. Required. + :vartype output_token_usage: int + :ivar total_token_usage: total token usage. Required. + :vartype total_token_usage: int + """ + + input_token_usage: int = rest_field( + name="inputTokenUsage", visibility=["read", "create", "update", "delete", "query"] + ) + """input token usage. Required.""" + output_token_usage: int = rest_field( + name="outputTokenUsage", visibility=["read", "create", "update", "delete", "query"] + ) + """output token usage. Required.""" + total_token_usage: int = rest_field( + name="totalTokenUsage", visibility=["read", "create", "update", "delete", "query"] + ) + """total token usage. Required.""" + + @overload + def __init__( + self, + *, + input_token_usage: int, + output_token_usage: int, + total_token_usage: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluatorDefinition(_Model): + """Base evaluator configuration with discriminator. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + CodeBasedEvaluatorDefinition, PromptBasedEvaluatorDefinition + + :ivar type: The type of evaluator definition. Required. Known values are: "prompt", "code", + "prompt_and_code", "service", and "openai_graders". + :vartype type: str or ~azure.ai.projects.models.EvaluatorDefinitionType + :ivar init_parameters: The JSON schema (Draft 2020-12) for the evaluator's input parameters. + This includes parameters like type, properties, required. + :vartype init_parameters: any + :ivar data_schema: The JSON schema (Draft 2020-12) for the evaluator's input data. This + includes parameters like type, properties, required. + :vartype data_schema: any + :ivar metrics: List of output metrics produced by this evaluator. + :vartype metrics: dict[str, ~azure.ai.projects.models.EvaluatorMetric] + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of evaluator definition. Required. Known values are: \"prompt\", \"code\", + \"prompt_and_code\", \"service\", and \"openai_graders\".""" + init_parameters: Optional[Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The JSON schema (Draft 2020-12) for the evaluator's input parameters. This includes parameters + like type, properties, required.""" + data_schema: Optional[Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The JSON schema (Draft 2020-12) for the evaluator's input data. This includes parameters like + type, properties, required.""" + metrics: Optional[dict[str, "_models.EvaluatorMetric"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """List of output metrics produced by this evaluator.""" + + @overload + def __init__( + self, + *, + type: str, + init_parameters: Optional[Any] = None, + data_schema: Optional[Any] = None, + metrics: Optional[dict[str, "_models.EvaluatorMetric"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CodeBasedEvaluatorDefinition(EvaluatorDefinition, discriminator="code"): + """Code-based evaluator definition using python code. + + :ivar init_parameters: The JSON schema (Draft 2020-12) for the evaluator's input parameters. + This includes parameters like type, properties, required. + :vartype init_parameters: any + :ivar data_schema: The JSON schema (Draft 2020-12) for the evaluator's input data. This + includes parameters like type, properties, required. + :vartype data_schema: any + :ivar metrics: List of output metrics produced by this evaluator. + :vartype metrics: dict[str, ~azure.ai.projects.models.EvaluatorMetric] + :ivar type: Required. Code-based definition + :vartype type: str or ~azure.ai.projects.models.CODE + :ivar code_text: Inline code text for the evaluator. Required. + :vartype code_text: str + """ + + type: Literal[EvaluatorDefinitionType.CODE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Code-based definition""" + code_text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Inline code text for the evaluator. Required.""" + + @overload + def __init__( + self, + *, + code_text: str, + init_parameters: Optional[Any] = None, + data_schema: Optional[Any] = None, + metrics: Optional[dict[str, "_models.EvaluatorMetric"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = EvaluatorDefinitionType.CODE # type: ignore + + +class CodeInterpreterOutput(_Model): + """CodeInterpreterOutput. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + CodeInterpreterOutputImage, CodeInterpreterOutputLogs + + :ivar type: Required. Known values are: "logs" and "image". + :vartype type: str or ~azure.ai.projects.models.CodeInterpreterOutputType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"logs\" and \"image\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CodeInterpreterOutputImage(CodeInterpreterOutput, discriminator="image"): + """The image output from the code interpreter. + + :ivar type: The type of the output. Always 'image'. Required. + :vartype type: str or ~azure.ai.projects.models.IMAGE + :ivar url: The URL of the image output from the code interpreter. Required. + :vartype url: str + """ + + type: Literal[CodeInterpreterOutputType.IMAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the output. Always 'image'. Required.""" + url: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL of the image output from the code interpreter. Required.""" + + @overload + def __init__( + self, + *, + url: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CodeInterpreterOutputType.IMAGE # type: ignore + + +class CodeInterpreterOutputLogs(CodeInterpreterOutput, discriminator="logs"): + """The logs output from the code interpreter. + + :ivar type: The type of the output. Always 'logs'. Required. + :vartype type: str or ~azure.ai.projects.models.LOGS + :ivar logs: The logs output from the code interpreter. Required. + :vartype logs: str + """ + + type: Literal[CodeInterpreterOutputType.LOGS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the output. Always 'logs'. Required.""" + logs: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The logs output from the code interpreter. Required.""" + + @overload + def __init__( + self, + *, + logs: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CodeInterpreterOutputType.LOGS # type: ignore + + +class CodeInterpreterTool(Tool, discriminator="code_interpreter"): + """A tool that runs Python code to help generate a response to a prompt. + + :ivar type: The type of the code interpreter tool. Always ``code_interpreter``. Required. + :vartype type: str or ~azure.ai.projects.models.CODE_INTERPRETER + :ivar container: The code interpreter container. Can be a container ID or an object that + specifies uploaded file IDs to make available to your code. Required. Is either a str type or a + CodeInterpreterToolAuto type. + :vartype container: str or ~azure.ai.projects.models.CodeInterpreterToolAuto + """ + + type: Literal[ToolType.CODE_INTERPRETER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the code interpreter tool. Always ``code_interpreter``. Required.""" + container: Union[str, "_models.CodeInterpreterToolAuto"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The code interpreter container. Can be a container ID or an object that + specifies uploaded file IDs to make available to your code. Required. Is either a str type or a + CodeInterpreterToolAuto type.""" + + @overload + def __init__( + self, + *, + container: Union[str, "_models.CodeInterpreterToolAuto"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.CODE_INTERPRETER # type: ignore + + +class CodeInterpreterToolAuto(_Model): + """Configuration for a code interpreter container. Optionally specify the IDs + of the files to run the code on. + + :ivar type: Always ``auto``. Required. Default value is "auto". + :vartype type: str + :ivar file_ids: An optional list of uploaded files to make available to your code. + :vartype file_ids: list[str] + """ + + type: Literal["auto"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Always ``auto``. Required. Default value is \"auto\".""" + file_ids: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An optional list of uploaded files to make available to your code.""" + + @overload + def __init__( + self, + *, + file_ids: Optional[list[str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["auto"] = "auto" + + +class ItemParam(_Model): + """Content item used to generate a response. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + CodeInterpreterToolCallItemParam, ComputerToolCallItemParam, ComputerToolCallOutputItemParam, + FileSearchToolCallItemParam, FunctionToolCallItemParam, FunctionToolCallOutputItemParam, + ImageGenToolCallItemParam, ItemReferenceItemParam, LocalShellToolCallItemParam, + LocalShellToolCallOutputItemParam, MCPApprovalRequestItemParam, MCPApprovalResponseItemParam, + MCPCallItemParam, MCPListToolsItemParam, MemorySearchToolCallItemParam, + ResponsesMessageItemParam, ReasoningItemParam, WebSearchToolCallItemParam + + :ivar type: Required. Known values are: "message", "file_search_call", "function_call", + "function_call_output", "computer_call", "computer_call_output", "web_search_call", + "reasoning", "item_reference", "image_generation_call", "code_interpreter_call", + "local_shell_call", "local_shell_call_output", "mcp_list_tools", "mcp_approval_request", + "mcp_approval_response", "mcp_call", "structured_outputs", "workflow_action", + "memory_search_call", and "oauth_consent_request". + :vartype type: str or ~azure.ai.projects.models.ItemType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"message\", \"file_search_call\", \"function_call\", + \"function_call_output\", \"computer_call\", \"computer_call_output\", \"web_search_call\", + \"reasoning\", \"item_reference\", \"image_generation_call\", \"code_interpreter_call\", + \"local_shell_call\", \"local_shell_call_output\", \"mcp_list_tools\", + \"mcp_approval_request\", \"mcp_approval_response\", \"mcp_call\", \"structured_outputs\", + \"workflow_action\", \"memory_search_call\", and \"oauth_consent_request\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CodeInterpreterToolCallItemParam(ItemParam, discriminator="code_interpreter_call"): + """A tool call to run code. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.CODE_INTERPRETER_CALL + :ivar container_id: The ID of the container used to run the code. Required. + :vartype container_id: str + :ivar code: The code to run, or null if not available. Required. + :vartype code: str + :ivar outputs: The outputs generated by the code interpreter, such as logs or images. + Can be null if no outputs are available. Required. + :vartype outputs: list[~azure.ai.projects.models.CodeInterpreterOutput] + """ + + type: Literal[ItemType.CODE_INTERPRETER_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + container_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the container used to run the code. Required.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The code to run, or null if not available. Required.""" + outputs: list["_models.CodeInterpreterOutput"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The outputs generated by the code interpreter, such as logs or images. + Can be null if no outputs are available. Required.""" + + @overload + def __init__( + self, + *, + container_id: str, + code: str, + outputs: list["_models.CodeInterpreterOutput"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.CODE_INTERPRETER_CALL # type: ignore + + +class ItemResource(_Model): + """Content item used to generate a response. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + CodeInterpreterToolCallItemResource, ComputerToolCallItemResource, + ComputerToolCallOutputItemResource, FileSearchToolCallItemResource, + FunctionToolCallItemResource, FunctionToolCallOutputItemResource, ImageGenToolCallItemResource, + LocalShellToolCallItemResource, LocalShellToolCallOutputItemResource, + MCPApprovalRequestItemResource, MCPApprovalResponseItemResource, MCPCallItemResource, + MCPListToolsItemResource, MemorySearchToolCallItemResource, ResponsesMessageItemResource, + OAuthConsentRequestItemResource, ReasoningItemResource, StructuredOutputsItemResource, + WebSearchToolCallItemResource, WorkflowActionOutputItemResource + + :ivar type: Required. Known values are: "message", "file_search_call", "function_call", + "function_call_output", "computer_call", "computer_call_output", "web_search_call", + "reasoning", "item_reference", "image_generation_call", "code_interpreter_call", + "local_shell_call", "local_shell_call_output", "mcp_list_tools", "mcp_approval_request", + "mcp_approval_response", "mcp_call", "structured_outputs", "workflow_action", + "memory_search_call", and "oauth_consent_request". + :vartype type: str or ~azure.ai.projects.models.ItemType + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"message\", \"file_search_call\", \"function_call\", + \"function_call_output\", \"computer_call\", \"computer_call_output\", \"web_search_call\", + \"reasoning\", \"item_reference\", \"image_generation_call\", \"code_interpreter_call\", + \"local_shell_call\", \"local_shell_call_output\", \"mcp_list_tools\", + \"mcp_approval_request\", \"mcp_approval_response\", \"mcp_call\", \"structured_outputs\", + \"workflow_action\", \"memory_search_call\", and \"oauth_consent_request\".""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + created_by: Optional["_models.CreatedBy"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The information about the creator of the item.""" + + @overload + def __init__( + self, + *, + type: str, + id: str, # pylint: disable=redefined-builtin + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CodeInterpreterToolCallItemResource(ItemResource, discriminator="code_interpreter_call"): + """A tool call to run code. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.CODE_INTERPRETER_CALL + :ivar status: Required. Is one of the following types: Literal["in_progress"], + Literal["completed"], Literal["incomplete"], Literal["interpreting"], Literal["failed"] + :vartype status: str or str or str or str or str + :ivar container_id: The ID of the container used to run the code. Required. + :vartype container_id: str + :ivar code: The code to run, or null if not available. Required. + :vartype code: str + :ivar outputs: The outputs generated by the code interpreter, such as logs or images. + Can be null if no outputs are available. Required. + :vartype outputs: list[~azure.ai.projects.models.CodeInterpreterOutput] + """ + + type: Literal[ItemType.CODE_INTERPRETER_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete", "interpreting", "failed"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required. Is one of the following types: Literal[\"in_progress\"], Literal[\"completed\"], + Literal[\"incomplete\"], Literal[\"interpreting\"], Literal[\"failed\"]""" + container_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the container used to run the code. Required.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The code to run, or null if not available. Required.""" + outputs: list["_models.CodeInterpreterOutput"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The outputs generated by the code interpreter, such as logs or images. + Can be null if no outputs are available. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete", "interpreting", "failed"], + container_id: str, + code: str, + outputs: list["_models.CodeInterpreterOutput"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.CODE_INTERPRETER_CALL # type: ignore + + +class ComparisonFilter(_Model): + """A filter used to compare a specified attribute key to a given value using a defined comparison + operation. + + :ivar type: Specifies the comparison operator: + ``eq`` (equal), ``ne`` (not equal), ``gt`` (greater than), ``gte`` (greater than or equal), + ``lt`` (less than), ``lte`` (less than or equal). Required. Is one of the following types: + Literal["eq"], Literal["ne"], Literal["gt"], Literal["gte"], Literal["lt"], Literal["lte"] + :vartype type: str or str or str or str or str or str + :ivar key: The key to compare against the value. Required. + :vartype key: str + :ivar value: The value to compare against the attribute key; supports string, number, or + boolean types. Required. Is one of the following types: str, float, bool + :vartype value: str or float or bool + """ + + type: Literal["eq", "ne", "gt", "gte", "lt", "lte"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Specifies the comparison operator: + ``eq`` (equal), ``ne`` (not equal), ``gt`` (greater than), ``gte`` (greater than or equal), + ``lt`` (less than), ``lte`` (less than or equal). Required. Is one of the following types: + Literal[\"eq\"], Literal[\"ne\"], Literal[\"gt\"], Literal[\"gte\"], Literal[\"lt\"], + Literal[\"lte\"]""" + key: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The key to compare against the value. Required.""" + value: Union[str, float, bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The value to compare against the attribute key; supports string, number, or boolean types. + Required. Is one of the following types: str, float, bool""" + + @overload + def __init__( + self, + *, + type: Literal["eq", "ne", "gt", "gte", "lt", "lte"], + key: str, + value: Union[str, float, bool], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CompoundFilter(_Model): + """Combine multiple filters using ``and`` or ``or``. + + :ivar type: Type of operation: ``and`` or ``or``. Required. Is either a Literal["and"] type or + a Literal["or"] type. + :vartype type: str or str + :ivar filters: Array of filters to combine. Items can be ``ComparisonFilter`` or + ``CompoundFilter``. Required. + :vartype filters: list[~azure.ai.projects.models.ComparisonFilter or + ~azure.ai.projects.models.CompoundFilter] + """ + + type: Literal["and", "or"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Type of operation: ``and`` or ``or``. Required. Is either a Literal[\"and\"] type or a + Literal[\"or\"] type.""" + filters: list[Union["_models.ComparisonFilter", "_models.CompoundFilter"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Array of filters to combine. Items can be ``ComparisonFilter`` or ``CompoundFilter``. Required.""" + + @overload + def __init__( + self, + *, + type: Literal["and", "or"], + filters: list[Union["_models.ComparisonFilter", "_models.CompoundFilter"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ComputerAction(_Model): + """ComputerAction. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ComputerActionClick, ComputerActionDoubleClick, ComputerActionDrag, ComputerActionKeyPress, + ComputerActionMove, ComputerActionScreenshot, ComputerActionScroll, ComputerActionTypeKeys, + ComputerActionWait + + :ivar type: Required. Known values are: "screenshot", "click", "double_click", "scroll", + "type", "wait", "keypress", "drag", and "move". + :vartype type: str or ~azure.ai.projects.models.ComputerActionType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"screenshot\", \"click\", \"double_click\", \"scroll\", \"type\", + \"wait\", \"keypress\", \"drag\", and \"move\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ComputerActionClick(ComputerAction, discriminator="click"): + """A click action. + + :ivar type: Specifies the event type. For a click action, this property is + always set to ``click``. Required. + :vartype type: str or ~azure.ai.projects.models.CLICK + :ivar button: Indicates which mouse button was pressed during the click. One of ``left``, + ``right``, ``wheel``, ``back``, or ``forward``. Required. Is one of the following types: + Literal["left"], Literal["right"], Literal["wheel"], Literal["back"], Literal["forward"] + :vartype button: str or str or str or str or str + :ivar x: The x-coordinate where the click occurred. Required. + :vartype x: int + :ivar y: The y-coordinate where the click occurred. Required. + :vartype y: int + """ + + type: Literal[ComputerActionType.CLICK] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a click action, this property is + always set to ``click``. Required.""" + button: Literal["left", "right", "wheel", "back", "forward"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Indicates which mouse button was pressed during the click. One of ``left``, ``right``, + ``wheel``, ``back``, or ``forward``. Required. Is one of the following types: + Literal[\"left\"], Literal[\"right\"], Literal[\"wheel\"], Literal[\"back\"], + Literal[\"forward\"]""" + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The x-coordinate where the click occurred. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The y-coordinate where the click occurred. Required.""" + + @overload + def __init__( + self, + *, + button: Literal["left", "right", "wheel", "back", "forward"], + x: int, + y: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.CLICK # type: ignore + + +class ComputerActionDoubleClick(ComputerAction, discriminator="double_click"): + """A double click action. + + :ivar type: Specifies the event type. For a double click action, this property is + always set to ``double_click``. Required. + :vartype type: str or ~azure.ai.projects.models.DOUBLE_CLICK + :ivar x: The x-coordinate where the double click occurred. Required. + :vartype x: int + :ivar y: The y-coordinate where the double click occurred. Required. + :vartype y: int + """ + + type: Literal[ComputerActionType.DOUBLE_CLICK] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a double click action, this property is + always set to ``double_click``. Required.""" + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The x-coordinate where the double click occurred. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The y-coordinate where the double click occurred. Required.""" + + @overload + def __init__( + self, + *, + x: int, + y: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.DOUBLE_CLICK # type: ignore + + +class ComputerActionDrag(ComputerAction, discriminator="drag"): + """A drag action. + + :ivar type: Specifies the event type. For a drag action, this property is + always set to ``drag``. Required. + :vartype type: str or ~azure.ai.projects.models.DRAG + :ivar path: An array of coordinates representing the path of the drag action. Coordinates will + appear as an array + of objects, eg + + .. code-block:: + + [ + { x: 100, y: 200 }, + { x: 200, y: 300 } + ]. Required. + :vartype path: list[~azure.ai.projects.models.Coordinate] + """ + + type: Literal[ComputerActionType.DRAG] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a drag action, this property is + always set to ``drag``. Required.""" + path: list["_models.Coordinate"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An array of coordinates representing the path of the drag action. Coordinates will appear as an + array + of objects, eg + + .. code-block:: + + [ + { x: 100, y: 200 }, + { x: 200, y: 300 } + ]. Required.""" + + @overload + def __init__( + self, + *, + path: list["_models.Coordinate"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.DRAG # type: ignore + + +class ComputerActionKeyPress(ComputerAction, discriminator="keypress"): + """A collection of keypresses the model would like to perform. + + :ivar type: Specifies the event type. For a keypress action, this property is + always set to ``keypress``. Required. + :vartype type: str or ~azure.ai.projects.models.KEYPRESS + :ivar keys_property: The combination of keys the model is requesting to be pressed. This is an + array of strings, each representing a key. Required. + :vartype keys_property: list[str] + """ + + type: Literal[ComputerActionType.KEYPRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a keypress action, this property is + always set to ``keypress``. Required.""" + keys_property: list[str] = rest_field(name="keys", visibility=["read", "create", "update", "delete", "query"]) + """The combination of keys the model is requesting to be pressed. This is an + array of strings, each representing a key. Required.""" + + @overload + def __init__( + self, + *, + keys_property: list[str], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.KEYPRESS # type: ignore + + +class ComputerActionMove(ComputerAction, discriminator="move"): + """A mouse move action. + + :ivar type: Specifies the event type. For a move action, this property is + always set to ``move``. Required. + :vartype type: str or ~azure.ai.projects.models.MOVE + :ivar x: The x-coordinate to move to. Required. + :vartype x: int + :ivar y: The y-coordinate to move to. Required. + :vartype y: int + """ + + type: Literal[ComputerActionType.MOVE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a move action, this property is + always set to ``move``. Required.""" + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The x-coordinate to move to. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The y-coordinate to move to. Required.""" + + @overload + def __init__( + self, + *, + x: int, + y: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.MOVE # type: ignore + + +class ComputerActionScreenshot(ComputerAction, discriminator="screenshot"): + """A screenshot action. + + :ivar type: Specifies the event type. For a screenshot action, this property is + always set to ``screenshot``. Required. + :vartype type: str or ~azure.ai.projects.models.SCREENSHOT + """ + + type: Literal[ComputerActionType.SCREENSHOT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a screenshot action, this property is + always set to ``screenshot``. Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.SCREENSHOT # type: ignore + + +class ComputerActionScroll(ComputerAction, discriminator="scroll"): + """A scroll action. + + :ivar type: Specifies the event type. For a scroll action, this property is + always set to ``scroll``. Required. + :vartype type: str or ~azure.ai.projects.models.SCROLL + :ivar x: The x-coordinate where the scroll occurred. Required. + :vartype x: int + :ivar y: The y-coordinate where the scroll occurred. Required. + :vartype y: int + :ivar scroll_x: The horizontal scroll distance. Required. + :vartype scroll_x: int + :ivar scroll_y: The vertical scroll distance. Required. + :vartype scroll_y: int + """ + + type: Literal[ComputerActionType.SCROLL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a scroll action, this property is + always set to ``scroll``. Required.""" + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The x-coordinate where the scroll occurred. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The y-coordinate where the scroll occurred. Required.""" + scroll_x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The horizontal scroll distance. Required.""" + scroll_y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The vertical scroll distance. Required.""" + + @overload + def __init__( + self, + *, + x: int, + y: int, + scroll_x: int, + scroll_y: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.SCROLL # type: ignore + + +class ComputerActionTypeKeys(ComputerAction, discriminator="type"): + """An action to type in text. + + :ivar type: Specifies the event type. For a type action, this property is + always set to ``type``. Required. + :vartype type: str or ~azure.ai.projects.models.TYPE + :ivar text: The text to type. Required. + :vartype text: str + """ + + type: Literal[ComputerActionType.TYPE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a type action, this property is + always set to ``type``. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text to type. Required.""" + + @overload + def __init__( + self, + *, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.TYPE # type: ignore + + +class ComputerActionWait(ComputerAction, discriminator="wait"): + """A wait action. + + :ivar type: Specifies the event type. For a wait action, this property is + always set to ``wait``. Required. + :vartype type: str or ~azure.ai.projects.models.WAIT + """ + + type: Literal[ComputerActionType.WAIT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Specifies the event type. For a wait action, this property is + always set to ``wait``. Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerActionType.WAIT # type: ignore + + +class ComputerToolCallItemParam(ItemParam, discriminator="computer_call"): + """A tool call to a computer use tool. See the + `computer use guide `_ for more information. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER_CALL + :ivar call_id: An identifier used when responding to the tool call with output. Required. + :vartype call_id: str + :ivar action: Required. + :vartype action: ~azure.ai.projects.models.ComputerAction + :ivar pending_safety_checks: The pending safety checks for the computer call. Required. + :vartype pending_safety_checks: list[~azure.ai.projects.models.ComputerToolCallSafetyCheck] + """ + + type: Literal[ItemType.COMPUTER_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An identifier used when responding to the tool call with output. Required.""" + action: "_models.ComputerAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + pending_safety_checks: list["_models.ComputerToolCallSafetyCheck"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The pending safety checks for the computer call. Required.""" + + @overload + def __init__( + self, + *, + call_id: str, + action: "_models.ComputerAction", + pending_safety_checks: list["_models.ComputerToolCallSafetyCheck"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.COMPUTER_CALL # type: ignore + + +class ComputerToolCallItemResource(ItemResource, discriminator="computer_call"): + """A tool call to a computer use tool. See the + `computer use guide `_ for more information. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER_CALL + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar call_id: An identifier used when responding to the tool call with output. Required. + :vartype call_id: str + :ivar action: Required. + :vartype action: ~azure.ai.projects.models.ComputerAction + :ivar pending_safety_checks: The pending safety checks for the computer call. Required. + :vartype pending_safety_checks: list[~azure.ai.projects.models.ComputerToolCallSafetyCheck] + """ + + type: Literal[ItemType.COMPUTER_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"completed\"], Literal[\"incomplete\"]""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An identifier used when responding to the tool call with output. Required.""" + action: "_models.ComputerAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + pending_safety_checks: list["_models.ComputerToolCallSafetyCheck"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The pending safety checks for the computer call. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + call_id: str, + action: "_models.ComputerAction", + pending_safety_checks: list["_models.ComputerToolCallSafetyCheck"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.COMPUTER_CALL # type: ignore + + +class ComputerToolCallOutputItemOutput(_Model): + """ComputerToolCallOutputItemOutput. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ComputerToolCallOutputItemOutputComputerScreenshot + + :ivar type: Required. "computer_screenshot" + :vartype type: str or ~azure.ai.projects.models.ComputerToolCallOutputItemOutputType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. \"computer_screenshot\"""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ComputerToolCallOutputItemOutputComputerScreenshot( + ComputerToolCallOutputItemOutput, discriminator="computer_screenshot" +): # pylint: disable=name-too-long + """ComputerToolCallOutputItemOutputComputerScreenshot. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.SCREENSHOT + :ivar image_url: + :vartype image_url: str + :ivar file_id: + :vartype file_id: str + """ + + type: Literal[ComputerToolCallOutputItemOutputType.SCREENSHOT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + image_url: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + file_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + + @overload + def __init__( + self, + *, + image_url: Optional[str] = None, + file_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ComputerToolCallOutputItemOutputType.SCREENSHOT # type: ignore + + +class ComputerToolCallOutputItemParam(ItemParam, discriminator="computer_call_output"): + """The output of a computer tool call. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER_CALL_OUTPUT + :ivar call_id: The ID of the computer tool call that produced the output. Required. + :vartype call_id: str + :ivar acknowledged_safety_checks: The safety checks reported by the API that have been + acknowledged by the + developer. + :vartype acknowledged_safety_checks: + list[~azure.ai.projects.models.ComputerToolCallSafetyCheck] + :ivar output: Required. + :vartype output: ~azure.ai.projects.models.ComputerToolCallOutputItemOutput + """ + + type: Literal[ItemType.COMPUTER_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the computer tool call that produced the output. Required.""" + acknowledged_safety_checks: Optional[list["_models.ComputerToolCallSafetyCheck"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The safety checks reported by the API that have been acknowledged by the + developer.""" + output: "_models.ComputerToolCallOutputItemOutput" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required.""" + + @overload + def __init__( + self, + *, + call_id: str, + output: "_models.ComputerToolCallOutputItemOutput", + acknowledged_safety_checks: Optional[list["_models.ComputerToolCallSafetyCheck"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.COMPUTER_CALL_OUTPUT # type: ignore + + +class ComputerToolCallOutputItemResource(ItemResource, discriminator="computer_call_output"): + """The output of a computer tool call. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER_CALL_OUTPUT + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar call_id: The ID of the computer tool call that produced the output. Required. + :vartype call_id: str + :ivar acknowledged_safety_checks: The safety checks reported by the API that have been + acknowledged by the + developer. + :vartype acknowledged_safety_checks: + list[~azure.ai.projects.models.ComputerToolCallSafetyCheck] + :ivar output: Required. + :vartype output: ~azure.ai.projects.models.ComputerToolCallOutputItemOutput + """ + + type: Literal[ItemType.COMPUTER_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"completed\"], Literal[\"incomplete\"]""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the computer tool call that produced the output. Required.""" + acknowledged_safety_checks: Optional[list["_models.ComputerToolCallSafetyCheck"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The safety checks reported by the API that have been acknowledged by the + developer.""" + output: "_models.ComputerToolCallOutputItemOutput" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + call_id: str, + output: "_models.ComputerToolCallOutputItemOutput", + created_by: Optional["_models.CreatedBy"] = None, + acknowledged_safety_checks: Optional[list["_models.ComputerToolCallSafetyCheck"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.COMPUTER_CALL_OUTPUT # type: ignore + + +class ComputerToolCallSafetyCheck(_Model): + """A pending safety check for the computer call. + + :ivar id: The ID of the pending safety check. Required. + :vartype id: str + :ivar code: The type of the pending safety check. Required. + :vartype code: str + :ivar message: Details about the pending safety check. Required. + :vartype message: str + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the pending safety check. Required.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The type of the pending safety check. Required.""" + message: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Details about the pending safety check. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + code: str, + message: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ComputerUsePreviewTool(Tool, discriminator="computer_use_preview"): + """A tool that controls a virtual computer. Learn more about the `computer tool + `_. + + :ivar type: The type of the computer use tool. Always ``computer_use_preview``. Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER_USE_PREVIEW + :ivar environment: The type of computer environment to control. Required. Is one of the + following types: Literal["windows"], Literal["mac"], Literal["linux"], Literal["ubuntu"], + Literal["browser"] + :vartype environment: str or str or str or str or str + :ivar display_width: The width of the computer display. Required. + :vartype display_width: int + :ivar display_height: The height of the computer display. Required. + :vartype display_height: int + """ + + type: Literal[ToolType.COMPUTER_USE_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the computer use tool. Always ``computer_use_preview``. Required.""" + environment: Literal["windows", "mac", "linux", "ubuntu", "browser"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The type of computer environment to control. Required. Is one of the following types: + Literal[\"windows\"], Literal[\"mac\"], Literal[\"linux\"], Literal[\"ubuntu\"], + Literal[\"browser\"]""" + display_width: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The width of the computer display. Required.""" + display_height: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The height of the computer display. Required.""" + + @overload + def __init__( + self, + *, + environment: Literal["windows", "mac", "linux", "ubuntu", "browser"], + display_width: int, + display_height: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.COMPUTER_USE_PREVIEW # type: ignore + + +class Connection(_Model): + """Response from the list and get connections operations. + + :ivar name: The friendly name of the connection, provided by the user. Required. + :vartype name: str + :ivar id: A unique identifier for the connection, generated by the service. Required. + :vartype id: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", + "CustomKeys", and "RemoteTool". + :vartype type: str or ~azure.ai.projects.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar credentials: The credentials used by the connection. Required. + :vartype credentials: ~azure.ai.projects.models.BaseCredentials + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + """ + + name: str = rest_field(visibility=["read"]) + """The friendly name of the connection, provided by the user. Required.""" + id: str = rest_field(visibility=["read"]) + """A unique identifier for the connection, generated by the service. Required.""" + type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) + """Category of the connection. Required. Known values are: \"AzureOpenAI\", \"AzureBlob\", + \"AzureStorageAccount\", \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppConfig\", + \"AppInsights\", \"CustomKeys\", and \"RemoteTool\".""" + target: str = rest_field(visibility=["read"]) + """The connection URL to be used for this service. Required.""" + is_default: bool = rest_field(name="isDefault", visibility=["read"]) + """Whether the connection is tagged as the default connection of its type. Required.""" + credentials: "_models.BaseCredentials" = rest_field(visibility=["read"]) + """The credentials used by the connection. Required.""" + metadata: dict[str, str] = rest_field(visibility=["read"]) + """Metadata of the connection. Required.""" + + +class ContainerAppAgentDefinition(AgentDefinition, discriminator="container_app"): + """The container app agent definition. + + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig + :ivar kind: Required. + :vartype kind: str or ~azure.ai.projects.models.CONTAINER_APP + :ivar container_protocol_versions: The protocols that the agent supports for ingress + communication of the containers. Required. + :vartype container_protocol_versions: list[~azure.ai.projects.models.ProtocolVersionRecord] + :ivar container_app_resource_id: The resource ID of the Azure Container App that hosts this + agent. Not mutable across versions. Required. + :vartype container_app_resource_id: str + :ivar ingress_subdomain_suffix: The suffix to apply to the app subdomain when sending ingress + to the agent. This can be a label (e.g., '---current'), a specific revision (e.g., + '--0000001'), or empty to use the default endpoint for the container app. Required. + :vartype ingress_subdomain_suffix: str + """ + + kind: Literal[AgentKind.CONTAINER_APP] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + container_protocol_versions: list["_models.ProtocolVersionRecord"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The protocols that the agent supports for ingress communication of the containers. Required.""" + container_app_resource_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The resource ID of the Azure Container App that hosts this agent. Not mutable across versions. + Required.""" + ingress_subdomain_suffix: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The suffix to apply to the app subdomain when sending ingress to the agent. This can be a label + (e.g., '---current'), a specific revision (e.g., '--0000001'), or empty to use the default + endpoint for the container app. Required.""" + + @overload + def __init__( + self, + *, + container_protocol_versions: list["_models.ProtocolVersionRecord"], + container_app_resource_id: str, + ingress_subdomain_suffix: str, + rai_config: Optional["_models.RaiConfig"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = AgentKind.CONTAINER_APP # type: ignore + + +class EvaluationRuleAction(_Model): + """Evaluation action model. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ContinuousEvaluationRuleAction, HumanEvaluationRuleAction + + :ivar type: Type of the evaluation action. Required. Known values are: "continuousEvaluation" + and "humanEvaluation". + :vartype type: str or ~azure.ai.projects.models.EvaluationRuleActionType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the evaluation action. Required. Known values are: \"continuousEvaluation\" and + \"humanEvaluation\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ContinuousEvaluationRuleAction(EvaluationRuleAction, discriminator="continuousEvaluation"): + """Evaluation rule action for continuous evaluation. + + :ivar type: Required. Continuous evaluation. + :vartype type: str or ~azure.ai.projects.models.CONTINUOUS_EVALUATION + :ivar eval_id: Eval Id to add continuous evaluation runs to. Required. + :vartype eval_id: str + :ivar max_hourly_runs: Maximum number of evaluation runs allowed per hour. + :vartype max_hourly_runs: int + """ + + type: Literal[EvaluationRuleActionType.CONTINUOUS_EVALUATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Continuous evaluation.""" + eval_id: str = rest_field(name="evalId", visibility=["read", "create", "update", "delete", "query"]) + """Eval Id to add continuous evaluation runs to. Required.""" + max_hourly_runs: Optional[int] = rest_field( + name="maxHourlyRuns", visibility=["read", "create", "update", "delete", "query"] + ) + """Maximum number of evaluation runs allowed per hour.""" + + @overload + def __init__( + self, + *, + eval_id: str, + max_hourly_runs: Optional[int] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = EvaluationRuleActionType.CONTINUOUS_EVALUATION # type: ignore + + +class Coordinate(_Model): + """An x/y coordinate pair, e.g. ``{ x: 100, y: 200 }``. + + :ivar x: The x-coordinate. Required. + :vartype x: int + :ivar y: The y-coordinate. Required. + :vartype y: int + """ + + x: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The x-coordinate. Required.""" + y: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The y-coordinate. Required.""" + + @overload + def __init__( + self, + *, + x: int, + y: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CosmosDBIndex(Index, discriminator="CosmosDBNoSqlVectorStore"): + """CosmosDB Vector Store Index Definition. + + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. CosmosDB + :vartype type: str or ~azure.ai.projects.models.COSMOS_DB + :ivar connection_name: Name of connection to CosmosDB. Required. + :vartype connection_name: str + :ivar database_name: Name of the CosmosDB Database. Required. + :vartype database_name: str + :ivar container_name: Name of CosmosDB Container. Required. + :vartype container_name: str + :ivar embedding_configuration: Embedding model configuration. Required. + :vartype embedding_configuration: ~azure.ai.projects.models.EmbeddingConfiguration + :ivar field_mapping: Field mapping configuration. Required. + :vartype field_mapping: ~azure.ai.projects.models.FieldMapping + """ + + type: Literal[IndexType.COSMOS_DB] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. CosmosDB""" + connection_name: str = rest_field(name="connectionName", visibility=["create"]) + """Name of connection to CosmosDB. Required.""" + database_name: str = rest_field(name="databaseName", visibility=["create"]) + """Name of the CosmosDB Database. Required.""" + container_name: str = rest_field(name="containerName", visibility=["create"]) + """Name of CosmosDB Container. Required.""" + embedding_configuration: "_models.EmbeddingConfiguration" = rest_field( + name="embeddingConfiguration", visibility=["create"] + ) + """Embedding model configuration. Required.""" + field_mapping: "_models.FieldMapping" = rest_field(name="fieldMapping", visibility=["create"]) + """Field mapping configuration. Required.""" + + @overload + def __init__( + self, + *, + connection_name: str, + database_name: str, + container_name: str, + embedding_configuration: "_models.EmbeddingConfiguration", + field_mapping: "_models.FieldMapping", + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = IndexType.COSMOS_DB # type: ignore + + +class CreatedBy(_Model): + """CreatedBy. + + :ivar agent: The agent that created the item. + :vartype agent: ~azure.ai.projects.models.AgentId + :ivar response_id: The response on which the item is created. + :vartype response_id: str + """ + + agent: Optional["_models.AgentId"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The agent that created the item.""" + response_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response on which the item is created.""" + + @overload + def __init__( + self, + *, + agent: Optional["_models.AgentId"] = None, + response_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Trigger(_Model): + """Base model for Trigger of the schedule. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + CronTrigger, OneTimeTrigger, RecurrenceTrigger + + :ivar type: Type of the trigger. Required. Known values are: "Cron", "Recurrence", and + "OneTime". + :vartype type: str or ~azure.ai.projects.models.TriggerType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the trigger. Required. Known values are: \"Cron\", \"Recurrence\", and \"OneTime\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CronTrigger(Trigger, discriminator="Cron"): + """Cron based trigger. + + :ivar type: Required. Cron based trigger. + :vartype type: str or ~azure.ai.projects.models.CRON + :ivar expression: Cron expression that defines the schedule frequency. Required. + :vartype expression: str + :ivar time_zone: Time zone for the cron schedule. + :vartype time_zone: str + :ivar start_time: Start time for the cron schedule in ISO 8601 format. + :vartype start_time: str + :ivar end_time: End time for the cron schedule in ISO 8601 format. + :vartype end_time: str + """ + + type: Literal[TriggerType.CRON] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Cron based trigger.""" + expression: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Cron expression that defines the schedule frequency. Required.""" + time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"]) + """Time zone for the cron schedule.""" + start_time: Optional[str] = rest_field(name="startTime", visibility=["read", "create", "update", "delete", "query"]) + """Start time for the cron schedule in ISO 8601 format.""" + end_time: Optional[str] = rest_field(name="endTime", visibility=["read", "create", "update", "delete", "query"]) + """End time for the cron schedule in ISO 8601 format.""" + + @overload + def __init__( + self, + *, + expression: str, + time_zone: Optional[str] = None, + start_time: Optional[str] = None, + end_time: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = TriggerType.CRON # type: ignore + + +class CustomCredential(BaseCredentials, discriminator="CustomKeys"): + """Custom credential definition. + + :ivar type: The credential type. Required. Custom credential + :vartype type: str or ~azure.ai.projects.models.CUSTOM + """ + + type: Literal[CredentialType.CUSTOM] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. Custom credential""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CredentialType.CUSTOM # type: ignore + + +class RecurrenceSchedule(_Model): + """Recurrence schedule model. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + DailyRecurrenceSchedule, HourlyRecurrenceSchedule, MonthlyRecurrenceSchedule, + WeeklyRecurrenceSchedule + + :ivar type: Recurrence type for the recurrence schedule. Required. Known values are: "Hourly", + "Daily", "Weekly", and "Monthly". + :vartype type: str or ~azure.ai.projects.models.RecurrenceType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Recurrence type for the recurrence schedule. Required. Known values are: \"Hourly\", \"Daily\", + \"Weekly\", and \"Monthly\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class DailyRecurrenceSchedule(RecurrenceSchedule, discriminator="Daily"): + """Daily recurrence schedule. + + :ivar type: Daily recurrence type. Required. Daily recurrence pattern. + :vartype type: str or ~azure.ai.projects.models.DAILY + :ivar hours: Hours for the recurrence schedule. Required. + :vartype hours: list[int] + """ + + type: Literal[RecurrenceType.DAILY] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Daily recurrence type. Required. Daily recurrence pattern.""" + hours: list[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Hours for the recurrence schedule. Required.""" + + @overload + def __init__( + self, + *, + hours: list[int], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = RecurrenceType.DAILY # type: ignore + + +class DatasetCredential(_Model): + """Represents a reference to a blob for consumption. + + :ivar blob_reference: Credential info to access the storage account. Required. + :vartype blob_reference: ~azure.ai.projects.models.BlobReference + """ + + blob_reference: "_models.BlobReference" = rest_field( + name="blobReference", visibility=["read", "create", "update", "delete", "query"] + ) + """Credential info to access the storage account. Required.""" + + @overload + def __init__( + self, + *, + blob_reference: "_models.BlobReference", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class DatasetVersion(_Model): + """DatasetVersion Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + FileDatasetVersion, FolderDatasetVersion + + :ivar data_uri: URI of the data (`example `_). + Required. + :vartype data_uri: str + :ivar type: Dataset type. Required. Known values are: "uri_file" and "uri_folder". + :vartype type: str or ~azure.ai.projects.models.DatasetType + :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset + manages storage itself. If true, the underlying data will not be deleted when the dataset + version is deleted. + :vartype is_reference: bool + :ivar connection_name: The Azure Storage Account connection name. Required if + startPendingUploadVersion was not called before creating the Dataset. + :vartype connection_name: str + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + __mapping__: dict[str, _Model] = {} + data_uri: str = rest_field(name="dataUri", visibility=["read", "create"]) + """URI of the data (`example `_). Required.""" + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Dataset type. Required. Known values are: \"uri_file\" and \"uri_folder\".""" + is_reference: Optional[bool] = rest_field(name="isReference", visibility=["read"]) + """Indicates if the dataset holds a reference to the storage, or the dataset manages storage + itself. If true, the underlying data will not be deleted when the dataset version is deleted.""" + connection_name: Optional[str] = rest_field(name="connectionName", visibility=["read", "create"]) + """The Azure Storage Account connection name. Required if startPendingUploadVersion was not called + before creating the Dataset.""" + id: Optional[str] = rest_field(visibility=["read"]) + """Asset ID, a unique identifier for the asset.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["create", "update"]) + """The asset description text.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + data_uri: str, + type: str, + connection_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class DeleteAgentResponse(_Model): + """A deleted agent Object. + + :ivar object: The object type. Always 'agent.deleted'. Required. Default value is + "agent.deleted". + :vartype object: str + :ivar name: The name of the agent. Required. + :vartype name: str + :ivar deleted: Whether the agent was successfully deleted. Required. + :vartype deleted: bool + """ + + object: Literal["agent.deleted"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type. Always 'agent.deleted'. Required. Default value is \"agent.deleted\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Required.""" + deleted: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the agent was successfully deleted. Required.""" + + @overload + def __init__( + self, + *, + name: str, + deleted: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["agent.deleted"] = "agent.deleted" + + +class DeleteAgentVersionResponse(_Model): + """A deleted agent version Object. + + :ivar object: The object type. Always 'agent.deleted'. Required. Default value is + "agent.version.deleted". + :vartype object: str + :ivar name: The name of the agent. Required. + :vartype name: str + :ivar version: The version identifier of the agent. Required. + :vartype version: str + :ivar deleted: Whether the agent was successfully deleted. Required. + :vartype deleted: bool + """ + + object: Literal["agent.version.deleted"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type. Always 'agent.deleted'. Required. Default value is \"agent.version.deleted\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the agent. Required.""" + version: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version identifier of the agent. Required.""" + deleted: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the agent was successfully deleted. Required.""" + + @overload + def __init__( + self, + *, + name: str, + version: str, + deleted: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["agent.version.deleted"] = "agent.version.deleted" + + +class DeleteMemoryStoreResponse(_Model): + """DeleteMemoryStoreResponse. + + :ivar object: The object type. Always 'memory_store.deleted'. Required. Default value is + "memory_store.deleted". + :vartype object: str + :ivar name: The name of the memory store. Required. + :vartype name: str + :ivar deleted: Whether the memory store was successfully deleted. Required. + :vartype deleted: bool + """ + + object: Literal["memory_store.deleted"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type. Always 'memory_store.deleted'. Required. Default value is + \"memory_store.deleted\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the memory store. Required.""" + deleted: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the memory store was successfully deleted. Required.""" + + @overload + def __init__( + self, + *, + name: str, + deleted: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["memory_store.deleted"] = "memory_store.deleted" + + +class Deployment(_Model): + """Model Deployment Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ModelDeployment + + :ivar type: The type of the deployment. Required. "ModelDeployment" + :vartype type: str or ~azure.ai.projects.models.DeploymentType + :ivar name: Name of the deployment. Required. + :vartype name: str + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of the deployment. Required. \"ModelDeployment\"""" + name: str = rest_field(visibility=["read"]) + """Name of the deployment. Required.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EmbeddingConfiguration(_Model): + """Embedding configuration class. + + :ivar model_deployment_name: Deployment name of embedding model. It can point to a model + deployment either in the parent AIServices or a connection. Required. + :vartype model_deployment_name: str + :ivar embedding_field: Embedding field. Required. + :vartype embedding_field: str + """ + + model_deployment_name: str = rest_field(name="modelDeploymentName", visibility=["create"]) + """Deployment name of embedding model. It can point to a model deployment either in the parent + AIServices or a connection. Required.""" + embedding_field: str = rest_field(name="embeddingField", visibility=["create"]) + """Embedding field. Required.""" + + @overload + def __init__( + self, + *, + model_deployment_name: str, + embedding_field: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EntraIDCredentials(BaseCredentials, discriminator="AAD"): + """Entra ID credential definition. + + :ivar type: The credential type. Required. Entra ID credential (formerly known as AAD) + :vartype type: str or ~azure.ai.projects.models.ENTRA_ID + """ + + type: Literal[CredentialType.ENTRA_ID] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. Entra ID credential (formerly known as AAD)""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CredentialType.ENTRA_ID # type: ignore + + +class EvalCompareReport(InsightResult, discriminator="EvaluationComparison"): + """Insights from the evaluation comparison. + + :ivar type: The type of insights result. Required. Evaluation Comparison. + :vartype type: str or ~azure.ai.projects.models.EVALUATION_COMPARISON + :ivar comparisons: Comparison results for each treatment run against the baseline. Required. + :vartype comparisons: list[~azure.ai.projects.models.EvalRunResultComparison] + :ivar method: The statistical method used for comparison. Required. + :vartype method: str + """ + + type: Literal[InsightType.EVALUATION_COMPARISON] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of insights result. Required. Evaluation Comparison.""" + comparisons: list["_models.EvalRunResultComparison"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Comparison results for each treatment run against the baseline. Required.""" + method: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The statistical method used for comparison. Required.""" + + @overload + def __init__( + self, + *, + comparisons: list["_models.EvalRunResultComparison"], + method: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = InsightType.EVALUATION_COMPARISON # type: ignore + + +class EvalResult(_Model): + """Result of the evaluation. + + :ivar name: name of the check. Required. + :vartype name: str + :ivar type: type of the check. Required. + :vartype type: str + :ivar score: score. Required. + :vartype score: float + :ivar passed: indicates if the check passed or failed. Required. + :vartype passed: bool + """ + + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """name of the check. Required.""" + type: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """type of the check. Required.""" + score: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """score. Required.""" + passed: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """indicates if the check passed or failed. Required.""" + + @overload + def __init__( + self, + *, + name: str, + type: str, + score: float, + passed: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvalRunResultCompareItem(_Model): + """Metric comparison for a treatment against the baseline. + + :ivar treatment_run_id: The treatment run ID. Required. + :vartype treatment_run_id: str + :ivar treatment_run_summary: Summary statistics of the treatment run. Required. + :vartype treatment_run_summary: ~azure.ai.projects.models.EvalRunResultSummary + :ivar delta_estimate: Estimated difference between treatment and baseline. Required. + :vartype delta_estimate: float + :ivar p_value: P-value for the treatment effect. Required. + :vartype p_value: float + :ivar treatment_effect: Type of treatment effect. Required. Known values are: "TooFewSamples", + "Inconclusive", "Changed", "Improved", and "Degraded". + :vartype treatment_effect: str or ~azure.ai.projects.models.TreatmentEffectType + """ + + treatment_run_id: str = rest_field( + name="treatmentRunId", visibility=["read", "create", "update", "delete", "query"] + ) + """The treatment run ID. Required.""" + treatment_run_summary: "_models.EvalRunResultSummary" = rest_field( + name="treatmentRunSummary", visibility=["read", "create", "update", "delete", "query"] + ) + """Summary statistics of the treatment run. Required.""" + delta_estimate: float = rest_field(name="deltaEstimate", visibility=["read", "create", "update", "delete", "query"]) + """Estimated difference between treatment and baseline. Required.""" + p_value: float = rest_field(name="pValue", visibility=["read", "create", "update", "delete", "query"]) + """P-value for the treatment effect. Required.""" + treatment_effect: Union[str, "_models.TreatmentEffectType"] = rest_field( + name="treatmentEffect", visibility=["read", "create", "update", "delete", "query"] + ) + """Type of treatment effect. Required. Known values are: \"TooFewSamples\", \"Inconclusive\", + \"Changed\", \"Improved\", and \"Degraded\".""" + + @overload + def __init__( + self, + *, + treatment_run_id: str, + treatment_run_summary: "_models.EvalRunResultSummary", + delta_estimate: float, + p_value: float, + treatment_effect: Union[str, "_models.TreatmentEffectType"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvalRunResultComparison(_Model): + """Comparison results for treatment runs against the baseline. + + :ivar testing_criteria: Name of the testing criteria. Required. + :vartype testing_criteria: str + :ivar metric: Metric being evaluated. Required. + :vartype metric: str + :ivar evaluator: Name of the evaluator for this testing criteria. Required. + :vartype evaluator: str + :ivar baseline_run_summary: Summary statistics of the baseline run. Required. + :vartype baseline_run_summary: ~azure.ai.projects.models.EvalRunResultSummary + :ivar compare_items: List of comparison results for each treatment run. Required. + :vartype compare_items: list[~azure.ai.projects.models.EvalRunResultCompareItem] + """ + + testing_criteria: str = rest_field( + name="testingCriteria", visibility=["read", "create", "update", "delete", "query"] + ) + """Name of the testing criteria. Required.""" + metric: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Metric being evaluated. Required.""" + evaluator: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Name of the evaluator for this testing criteria. Required.""" + baseline_run_summary: "_models.EvalRunResultSummary" = rest_field( + name="baselineRunSummary", visibility=["read", "create", "update", "delete", "query"] + ) + """Summary statistics of the baseline run. Required.""" + compare_items: list["_models.EvalRunResultCompareItem"] = rest_field( + name="compareItems", visibility=["read", "create", "update", "delete", "query"] + ) + """List of comparison results for each treatment run. Required.""" + + @overload + def __init__( + self, + *, + testing_criteria: str, + metric: str, + evaluator: str, + baseline_run_summary: "_models.EvalRunResultSummary", + compare_items: list["_models.EvalRunResultCompareItem"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvalRunResultSummary(_Model): + """Summary statistics of a metric in an evaluation run. + + :ivar run_id: The evaluation run ID. Required. + :vartype run_id: str + :ivar sample_count: Number of samples in the evaluation run. Required. + :vartype sample_count: int + :ivar average: Average value of the metric in the evaluation run. Required. + :vartype average: float + :ivar standard_deviation: Standard deviation of the metric in the evaluation run. Required. + :vartype standard_deviation: float + """ + + run_id: str = rest_field(name="runId", visibility=["read", "create", "update", "delete", "query"]) + """The evaluation run ID. Required.""" + sample_count: int = rest_field(name="sampleCount", visibility=["read", "create", "update", "delete", "query"]) + """Number of samples in the evaluation run. Required.""" + average: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Average value of the metric in the evaluation run. Required.""" + standard_deviation: float = rest_field( + name="standardDeviation", visibility=["read", "create", "update", "delete", "query"] + ) + """Standard deviation of the metric in the evaluation run. Required.""" + + @overload + def __init__( + self, + *, + run_id: str, + sample_count: int, + average: float, + standard_deviation: float, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationComparisonRequest(InsightRequest, discriminator="EvaluationComparison"): + """Evaluation Comparison Request. + + :ivar type: The type of request. Required. Evaluation Comparison. + :vartype type: str or ~azure.ai.projects.models.EVALUATION_COMPARISON + :ivar eval_id: Identifier for the evaluation. Required. + :vartype eval_id: str + :ivar baseline_run_id: The baseline run ID for comparison. Required. + :vartype baseline_run_id: str + :ivar treatment_run_ids: List of treatment run IDs for comparison. Required. + :vartype treatment_run_ids: list[str] + """ + + type: Literal[InsightType.EVALUATION_COMPARISON] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of request. Required. Evaluation Comparison.""" + eval_id: str = rest_field(name="evalId", visibility=["read", "create", "update", "delete", "query"]) + """Identifier for the evaluation. Required.""" + baseline_run_id: str = rest_field(name="baselineRunId", visibility=["read", "create", "update", "delete", "query"]) + """The baseline run ID for comparison. Required.""" + treatment_run_ids: list[str] = rest_field( + name="treatmentRunIds", visibility=["read", "create", "update", "delete", "query"] + ) + """List of treatment run IDs for comparison. Required.""" + + @overload + def __init__( + self, + *, + eval_id: str, + baseline_run_id: str, + treatment_run_ids: list[str], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = InsightType.EVALUATION_COMPARISON # type: ignore + + +class InsightSample(_Model): + """A sample from the analysis. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + EvaluationResultSample + + :ivar id: The unique identifier for the analysis sample. Required. + :vartype id: str + :ivar type: Sample type. Required. "EvaluationResultSample" + :vartype type: str or ~azure.ai.projects.models.SampleType + :ivar features: Features to help with additional filtering of data in UX. Required. + :vartype features: dict[str, any] + :ivar correlation_info: Info about the correlation for the analysis sample. Required. + :vartype correlation_info: dict[str, any] + """ + + __mapping__: dict[str, _Model] = {} + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier for the analysis sample. Required.""" + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Sample type. Required. \"EvaluationResultSample\"""" + features: dict[str, Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Features to help with additional filtering of data in UX. Required.""" + correlation_info: dict[str, Any] = rest_field( + name="correlationInfo", visibility=["read", "create", "update", "delete", "query"] + ) + """Info about the correlation for the analysis sample. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + type: str, + features: dict[str, Any], + correlation_info: dict[str, Any], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationResultSample(InsightSample, discriminator="EvaluationResultSample"): + """A sample from the evaluation result. + + :ivar id: The unique identifier for the analysis sample. Required. + :vartype id: str + :ivar features: Features to help with additional filtering of data in UX. Required. + :vartype features: dict[str, any] + :ivar correlation_info: Info about the correlation for the analysis sample. Required. + :vartype correlation_info: dict[str, any] + :ivar type: Evaluation Result Sample Type. Required. A sample from the evaluation result. + :vartype type: str or ~azure.ai.projects.models.EVALUATION_RESULT_SAMPLE + :ivar evaluation_result: Evaluation result for the analysis sample. Required. + :vartype evaluation_result: ~azure.ai.projects.models.EvalResult + """ + + type: Literal[SampleType.EVALUATION_RESULT_SAMPLE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Evaluation Result Sample Type. Required. A sample from the evaluation result.""" + evaluation_result: "_models.EvalResult" = rest_field( + name="evaluationResult", visibility=["read", "create", "update", "delete", "query"] + ) + """Evaluation result for the analysis sample. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + features: dict[str, Any], + correlation_info: dict[str, Any], + evaluation_result: "_models.EvalResult", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = SampleType.EVALUATION_RESULT_SAMPLE # type: ignore + + +class EvaluationRule(_Model): + """Evaluation rule model. + + :ivar id: Unique identifier for the evaluation rule. Required. + :vartype id: str + :ivar display_name: Display Name for the evaluation rule. + :vartype display_name: str + :ivar description: Description for the evaluation rule. + :vartype description: str + :ivar action: Definition of the evaluation rule action. Required. + :vartype action: ~azure.ai.projects.models.EvaluationRuleAction + :ivar filter: Filter condition of the evaluation rule. + :vartype filter: ~azure.ai.projects.models.EvaluationRuleFilter + :ivar event_type: Event type that the evaluation rule applies to. Required. Known values are: + "response.completed" and "manual". + :vartype event_type: str or ~azure.ai.projects.models.EvaluationRuleEventType + :ivar enabled: Indicates whether the evaluation rule is enabled. Default is true. Required. + :vartype enabled: bool + :ivar system_data: System metadata for the evaluation rule. Required. + :vartype system_data: dict[str, str] + """ + + id: str = rest_field(visibility=["read"]) + """Unique identifier for the evaluation rule. Required.""" + display_name: Optional[str] = rest_field( + name="displayName", visibility=["read", "create", "update", "delete", "query"] + ) + """Display Name for the evaluation rule.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description for the evaluation rule.""" + action: "_models.EvaluationRuleAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Definition of the evaluation rule action. Required.""" + filter: Optional["_models.EvaluationRuleFilter"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Filter condition of the evaluation rule.""" + event_type: Union[str, "_models.EvaluationRuleEventType"] = rest_field( + name="eventType", visibility=["read", "create", "update", "delete", "query"] + ) + """Event type that the evaluation rule applies to. Required. Known values are: + \"response.completed\" and \"manual\".""" + enabled: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Indicates whether the evaluation rule is enabled. Default is true. Required.""" + system_data: dict[str, str] = rest_field(name="systemData", visibility=["read"]) + """System metadata for the evaluation rule. Required.""" + + @overload + def __init__( + self, + *, + action: "_models.EvaluationRuleAction", + event_type: Union[str, "_models.EvaluationRuleEventType"], + enabled: bool, + display_name: Optional[str] = None, + description: Optional[str] = None, + filter: Optional["_models.EvaluationRuleFilter"] = None, # pylint: disable=redefined-builtin + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationRuleFilter(_Model): + """Evaluation filter model. + + :ivar agent_name: Filter by agent name. Required. + :vartype agent_name: str + """ + + agent_name: str = rest_field(name="agentName", visibility=["read", "create", "update", "delete", "query"]) + """Filter by agent name. Required.""" + + @overload + def __init__( + self, + *, + agent_name: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationRunClusterInsightResult(InsightResult, discriminator="EvaluationRunClusterInsight"): + """Insights from the evaluation run cluster analysis. + + :ivar type: The type of insights result. Required. Insights on an Evaluation run result. + :vartype type: str or ~azure.ai.projects.models.EVALUATION_RUN_CLUSTER_INSIGHT + :ivar cluster_insight: Required. + :vartype cluster_insight: ~azure.ai.projects.models.ClusterInsightResult + """ + + type: Literal[InsightType.EVALUATION_RUN_CLUSTER_INSIGHT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of insights result. Required. Insights on an Evaluation run result.""" + cluster_insight: "_models.ClusterInsightResult" = rest_field( + name="clusterInsight", visibility=["read", "create", "update", "delete", "query"] + ) + """Required.""" + + @overload + def __init__( + self, + *, + cluster_insight: "_models.ClusterInsightResult", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = InsightType.EVALUATION_RUN_CLUSTER_INSIGHT # type: ignore + + +class EvaluationRunClusterInsightsRequest(InsightRequest, discriminator="EvaluationRunClusterInsight"): + """Insights on set of Evaluation Results. + + :ivar type: The type of insights request. Required. Insights on an Evaluation run result. + :vartype type: str or ~azure.ai.projects.models.EVALUATION_RUN_CLUSTER_INSIGHT + :ivar eval_id: Evaluation Id for the insights. Required. + :vartype eval_id: str + :ivar run_ids: List of evaluation run IDs for the insights. Required. + :vartype run_ids: list[str] + :ivar model_configuration: Configuration of the model used in the insight generation. + :vartype model_configuration: ~azure.ai.projects.models.InsightModelConfiguration + """ + + type: Literal[InsightType.EVALUATION_RUN_CLUSTER_INSIGHT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of insights request. Required. Insights on an Evaluation run result.""" + eval_id: str = rest_field(name="evalId", visibility=["read", "create", "update", "delete", "query"]) + """Evaluation Id for the insights. Required.""" + run_ids: list[str] = rest_field(name="runIds", visibility=["read", "create", "update", "delete", "query"]) + """List of evaluation run IDs for the insights. Required.""" + model_configuration: Optional["_models.InsightModelConfiguration"] = rest_field( + name="modelConfiguration", visibility=["read", "create", "update", "delete", "query"] + ) + """Configuration of the model used in the insight generation.""" + + @overload + def __init__( + self, + *, + eval_id: str, + run_ids: list[str], + model_configuration: Optional["_models.InsightModelConfiguration"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = InsightType.EVALUATION_RUN_CLUSTER_INSIGHT # type: ignore + + +class ScheduleTask(_Model): + """Schedule task model. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + EvaluationScheduleTask, InsightScheduleTask + + :ivar type: Type of the task. Required. Known values are: "Evaluation" and "Insight". + :vartype type: str or ~azure.ai.projects.models.ScheduleTaskType + :ivar configuration: Configuration for the task. + :vartype configuration: dict[str, str] + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the task. Required. Known values are: \"Evaluation\" and \"Insight\".""" + configuration: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Configuration for the task.""" + + @overload + def __init__( + self, + *, + type: str, + configuration: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationScheduleTask(ScheduleTask, discriminator="Evaluation"): + """Evaluation task for the schedule. + + :ivar configuration: Configuration for the task. + :vartype configuration: dict[str, str] + :ivar type: Required. Evaluation task. + :vartype type: str or ~azure.ai.projects.models.EVALUATION + :ivar eval_id: Identifier of the evaluation group. Required. + :vartype eval_id: str + :ivar eval_run: The evaluation run payload. Required. + :vartype eval_run: any + """ + + type: Literal[ScheduleTaskType.EVALUATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Evaluation task.""" + eval_id: str = rest_field(name="evalId", visibility=["read", "create", "update", "delete", "query"]) + """Identifier of the evaluation group. Required.""" + eval_run: Any = rest_field(name="evalRun", visibility=["read", "create", "update", "delete", "query"]) + """The evaluation run payload. Required.""" + + @overload + def __init__( + self, + *, + eval_id: str, + eval_run: Any, + configuration: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ScheduleTaskType.EVALUATION # type: ignore + + +class EvaluationTaxonomy(_Model): + """Evaluation Taxonomy Definition. + + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar taxonomy_input: Input configuration for the evaluation taxonomy. Required. + :vartype taxonomy_input: ~azure.ai.projects.models.EvaluationTaxonomyInput + :ivar taxonomy_categories: List of taxonomy categories. + :vartype taxonomy_categories: list[~azure.ai.projects.models.TaxonomyCategory] + :ivar properties: Additional properties for the evaluation taxonomy. + :vartype properties: dict[str, str] + """ + + id: Optional[str] = rest_field(visibility=["read"]) + """Asset ID, a unique identifier for the asset.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["create", "update"]) + """The asset description text.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + taxonomy_input: "_models.EvaluationTaxonomyInput" = rest_field( + name="taxonomyInput", visibility=["read", "create", "update", "delete", "query"] + ) + """Input configuration for the evaluation taxonomy. Required.""" + taxonomy_categories: Optional[list["_models.TaxonomyCategory"]] = rest_field( + name="taxonomyCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of taxonomy categories.""" + properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Additional properties for the evaluation taxonomy.""" + + @overload + def __init__( + self, + *, + taxonomy_input: "_models.EvaluationTaxonomyInput", + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + taxonomy_categories: Optional[list["_models.TaxonomyCategory"]] = None, + properties: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluatorMetric(_Model): + """Evaluator Metric. + + :ivar type: Type of the metric. Known values are: "ordinal", "continuous", and "boolean". + :vartype type: str or ~azure.ai.projects.models.EvaluatorMetricType + :ivar desirable_direction: It indicates whether a higher value is better or a lower value is + better for this metric. Known values are: "increase", "decrease", and "neutral". + :vartype desirable_direction: str or ~azure.ai.projects.models.EvaluatorMetricDirection + :ivar min_value: Minimum value for the metric. + :vartype min_value: float + :ivar max_value: Maximum value for the metric. If not specified, it is assumed to be unbounded. + :vartype max_value: float + :ivar is_primary: Indicates if this metric is primary when there are multiple metrics. + :vartype is_primary: bool + """ + + type: Optional[Union[str, "_models.EvaluatorMetricType"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Type of the metric. Known values are: \"ordinal\", \"continuous\", and \"boolean\".""" + desirable_direction: Optional[Union[str, "_models.EvaluatorMetricDirection"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """It indicates whether a higher value is better or a lower value is better for this metric. Known + values are: \"increase\", \"decrease\", and \"neutral\".""" + min_value: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Minimum value for the metric.""" + max_value: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Maximum value for the metric. If not specified, it is assumed to be unbounded.""" + is_primary: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Indicates if this metric is primary when there are multiple metrics.""" + + @overload + def __init__( + self, + *, + type: Optional[Union[str, "_models.EvaluatorMetricType"]] = None, + desirable_direction: Optional[Union[str, "_models.EvaluatorMetricDirection"]] = None, + min_value: Optional[float] = None, + max_value: Optional[float] = None, + is_primary: Optional[bool] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluatorVersion(_Model): + """Evaluator Definition. + + :ivar display_name: Display Name for evaluator. It helps to find the evaluator easily in AI + Foundry. It does not need to be unique. + :vartype display_name: str + :ivar metadata: Metadata about the evaluator. + :vartype metadata: dict[str, str] + :ivar evaluator_type: The type of the evaluator. Required. Known values are: "builtin" and + "custom". + :vartype evaluator_type: str or ~azure.ai.projects.models.EvaluatorType + :ivar categories: The categories of the evaluator. Required. + :vartype categories: list[str or ~azure.ai.projects.models.EvaluatorCategory] + :ivar definition: Definition of the evaluator. Required. + :vartype definition: ~azure.ai.projects.models.EvaluatorDefinition + :ivar created_by: Creator of the evaluator. Required. + :vartype created_by: str + :ivar created_at: Creation date/time of the evaluator. Required. + :vartype created_at: int + :ivar modified_at: Last modified date/time of the evaluator. Required. + :vartype modified_at: int + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + display_name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Display Name for evaluator. It helps to find the evaluator easily in AI Foundry. It does not + need to be unique.""" + metadata: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Metadata about the evaluator.""" + evaluator_type: Union[str, "_models.EvaluatorType"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The type of the evaluator. Required. Known values are: \"builtin\" and \"custom\".""" + categories: list[Union[str, "_models.EvaluatorCategory"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The categories of the evaluator. Required.""" + definition: "_models.EvaluatorDefinition" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Definition of the evaluator. Required.""" + created_by: str = rest_field(visibility=["read"]) + """Creator of the evaluator. Required.""" + created_at: int = rest_field(visibility=["read"]) + """Creation date/time of the evaluator. Required.""" + modified_at: int = rest_field(visibility=["read"]) + """Last modified date/time of the evaluator. Required.""" + id: Optional[str] = rest_field(visibility=["read"]) + """Asset ID, a unique identifier for the asset.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["create", "update"]) + """The asset description text.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + evaluator_type: Union[str, "_models.EvaluatorType"], + categories: list[Union[str, "_models.EvaluatorCategory"]], + definition: "_models.EvaluatorDefinition", + display_name: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class FabricDataAgentToolParameters(_Model): + """The fabric data agent tool parameters. + + :ivar project_connections: The project connections attached to this tool. There can be a + maximum of 1 connection + resource attached to the tool. + :vartype project_connections: list[~azure.ai.projects.models.ToolProjectConnection] + """ + + project_connections: Optional[list["_models.ToolProjectConnection"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The project connections attached to this tool. There can be a maximum of 1 connection + resource attached to the tool.""" + + @overload + def __init__( + self, + *, + project_connections: Optional[list["_models.ToolProjectConnection"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class FieldMapping(_Model): + """Field mapping configuration class. + + :ivar content_fields: List of fields with text content. Required. + :vartype content_fields: list[str] + :ivar filepath_field: Path of file to be used as a source of text content. + :vartype filepath_field: str + :ivar title_field: Field containing the title of the document. + :vartype title_field: str + :ivar url_field: Field containing the url of the document. + :vartype url_field: str + :ivar vector_fields: List of fields with vector content. + :vartype vector_fields: list[str] + :ivar metadata_fields: List of fields with metadata content. + :vartype metadata_fields: list[str] + """ + + content_fields: list[str] = rest_field(name="contentFields", visibility=["create"]) + """List of fields with text content. Required.""" + filepath_field: Optional[str] = rest_field(name="filepathField", visibility=["create"]) + """Path of file to be used as a source of text content.""" + title_field: Optional[str] = rest_field(name="titleField", visibility=["create"]) + """Field containing the title of the document.""" + url_field: Optional[str] = rest_field(name="urlField", visibility=["create"]) + """Field containing the url of the document.""" + vector_fields: Optional[list[str]] = rest_field(name="vectorFields", visibility=["create"]) + """List of fields with vector content.""" + metadata_fields: Optional[list[str]] = rest_field(name="metadataFields", visibility=["create"]) + """List of fields with metadata content.""" + + @overload + def __init__( + self, + *, + content_fields: list[str], + filepath_field: Optional[str] = None, + title_field: Optional[str] = None, + url_field: Optional[str] = None, + vector_fields: Optional[list[str]] = None, + metadata_fields: Optional[list[str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class FileDatasetVersion(DatasetVersion, discriminator="uri_file"): + """FileDatasetVersion Definition. + + :ivar data_uri: URI of the data (`example `_). + Required. + :vartype data_uri: str + :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset + manages storage itself. If true, the underlying data will not be deleted when the dataset + version is deleted. + :vartype is_reference: bool + :ivar connection_name: The Azure Storage Account connection name. Required if + startPendingUploadVersion was not called before creating the Dataset. + :vartype connection_name: str + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Dataset type. Required. URI file. + :vartype type: str or ~azure.ai.projects.models.URI_FILE + """ + + type: Literal[DatasetType.URI_FILE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Dataset type. Required. URI file.""" + + @overload + def __init__( + self, + *, + data_uri: str, + connection_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = DatasetType.URI_FILE # type: ignore + + +class FileSearchTool(Tool, discriminator="file_search"): + """A tool that searches for relevant content from uploaded files. Learn more about the `file + search tool `_. + + :ivar type: The type of the file search tool. Always ``file_search``. Required. + :vartype type: str or ~azure.ai.projects.models.FILE_SEARCH + :ivar vector_store_ids: The IDs of the vector stores to search. Required. + :vartype vector_store_ids: list[str] + :ivar max_num_results: The maximum number of results to return. This number should be between 1 + and 50 inclusive. + :vartype max_num_results: int + :ivar ranking_options: Ranking options for search. + :vartype ranking_options: ~azure.ai.projects.models.RankingOptions + :ivar filters: A filter to apply. Is either a ComparisonFilter type or a CompoundFilter type. + :vartype filters: ~azure.ai.projects.models.ComparisonFilter or + ~azure.ai.projects.models.CompoundFilter + """ + + type: Literal[ToolType.FILE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the file search tool. Always ``file_search``. Required.""" + vector_store_ids: list[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The IDs of the vector stores to search. Required.""" + max_num_results: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The maximum number of results to return. This number should be between 1 and 50 inclusive.""" + ranking_options: Optional["_models.RankingOptions"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Ranking options for search.""" + filters: Optional[Union["_models.ComparisonFilter", "_models.CompoundFilter"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A filter to apply. Is either a ComparisonFilter type or a CompoundFilter type.""" + + @overload + def __init__( + self, + *, + vector_store_ids: list[str], + max_num_results: Optional[int] = None, + ranking_options: Optional["_models.RankingOptions"] = None, + filters: Optional[Union["_models.ComparisonFilter", "_models.CompoundFilter"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.FILE_SEARCH # type: ignore + + +class FileSearchToolCallItemParam(ItemParam, discriminator="file_search_call"): + """The results of a file search tool call. See the + `file search guide `_ for more information. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FILE_SEARCH_CALL + :ivar queries: The queries used to search for files. Required. + :vartype queries: list[str] + :ivar results: The results of the file search tool call. + :vartype results: list[~azure.ai.projects.models.FileSearchToolCallItemParamResult] + """ + + type: Literal[ItemType.FILE_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + queries: list[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The queries used to search for files. Required.""" + results: Optional[list["_models.FileSearchToolCallItemParamResult"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The results of the file search tool call.""" + + @overload + def __init__( + self, + *, + queries: list[str], + results: Optional[list["_models.FileSearchToolCallItemParamResult"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FILE_SEARCH_CALL # type: ignore + + +class FileSearchToolCallItemParamResult(_Model): + """FileSearchToolCallItemParamResult. + + :ivar file_id: The unique ID of the file. + :vartype file_id: str + :ivar text: The text that was retrieved from the file. + :vartype text: str + :ivar filename: The name of the file. + :vartype filename: str + :ivar attributes: + :vartype attributes: ~azure.ai.projects.models.VectorStoreFileAttributes + :ivar score: The relevance score of the file - a value between 0 and 1. + :vartype score: float + """ + + file_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the file.""" + text: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text that was retrieved from the file.""" + filename: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the file.""" + attributes: Optional["_models.VectorStoreFileAttributes"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + score: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The relevance score of the file - a value between 0 and 1.""" + + @overload + def __init__( + self, + *, + file_id: Optional[str] = None, + text: Optional[str] = None, + filename: Optional[str] = None, + attributes: Optional["_models.VectorStoreFileAttributes"] = None, + score: Optional[float] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class FileSearchToolCallItemResource(ItemResource, discriminator="file_search_call"): + """The results of a file search tool call. See the + `file search guide `_ for more information. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FILE_SEARCH_CALL + :ivar status: The status of the file search tool call. One of ``in_progress``, + ``searching``, ``incomplete`` or ``failed``,. Required. Is one of the following types: + Literal["in_progress"], Literal["searching"], Literal["completed"], Literal["incomplete"], + Literal["failed"] + :vartype status: str or str or str or str or str + :ivar queries: The queries used to search for files. Required. + :vartype queries: list[str] + :ivar results: The results of the file search tool call. + :vartype results: list[~azure.ai.projects.models.FileSearchToolCallItemParamResult] + """ + + type: Literal[ItemType.FILE_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "searching", "completed", "incomplete", "failed"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the file search tool call. One of ``in_progress``, + ``searching``, ``incomplete`` or ``failed``,. Required. Is one of the following types: + Literal[\"in_progress\"], Literal[\"searching\"], Literal[\"completed\"], + Literal[\"incomplete\"], Literal[\"failed\"]""" + queries: list[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The queries used to search for files. Required.""" + results: Optional[list["_models.FileSearchToolCallItemParamResult"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The results of the file search tool call.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "searching", "completed", "incomplete", "failed"], + queries: list[str], + created_by: Optional["_models.CreatedBy"] = None, + results: Optional[list["_models.FileSearchToolCallItemParamResult"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FILE_SEARCH_CALL # type: ignore + + +class FolderDatasetVersion(DatasetVersion, discriminator="uri_folder"): + """FileDatasetVersion Definition. + + :ivar data_uri: URI of the data (`example `_). + Required. + :vartype data_uri: str + :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset + manages storage itself. If true, the underlying data will not be deleted when the dataset + version is deleted. + :vartype is_reference: bool + :ivar connection_name: The Azure Storage Account connection name. Required if + startPendingUploadVersion was not called before creating the Dataset. + :vartype connection_name: str + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Dataset type. Required. URI folder. + :vartype type: str or ~azure.ai.projects.models.URI_FOLDER + """ + + type: Literal[DatasetType.URI_FOLDER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Dataset type. Required. URI folder.""" + + @overload + def __init__( + self, + *, + data_uri: str, + connection_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = DatasetType.URI_FOLDER # type: ignore + + +class FunctionTool(Tool, discriminator="function"): + """Defines a function in your own code the model can choose to call. Learn more about `function + calling `_. + + :ivar type: The type of the function tool. Always ``function``. Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION + :ivar name: The name of the function to call. Required. + :vartype name: str + :ivar description: A description of the function. Used by the model to determine whether or not + to call the function. + :vartype description: str + :ivar parameters: A JSON schema object describing the parameters of the function. Required. + :vartype parameters: any + :ivar strict: Whether to enforce strict parameter validation. Default ``true``. Required. + :vartype strict: bool + """ + + type: Literal[ToolType.FUNCTION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the function tool. Always ``function``. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to call. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of the function. Used by the model to determine whether or not to call the + function.""" + parameters: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON schema object describing the parameters of the function. Required.""" + strict: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to enforce strict parameter validation. Default ``true``. Required.""" + + @overload + def __init__( + self, + *, + name: str, + parameters: Any, + strict: bool, + description: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.FUNCTION # type: ignore + + +class FunctionToolCallItemParam(ItemParam, discriminator="function_call"): + """A tool call to run a function. See the + `function calling guide `_ for more information. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION_CALL + :ivar call_id: The unique ID of the function tool call generated by the model. Required. + :vartype call_id: str + :ivar name: The name of the function to run. Required. + :vartype name: str + :ivar arguments: A JSON string of the arguments to pass to the function. Required. + :vartype arguments: str + """ + + type: Literal[ItemType.FUNCTION_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the function tool call generated by the model. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the arguments to pass to the function. Required.""" + + @overload + def __init__( + self, + *, + call_id: str, + name: str, + arguments: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FUNCTION_CALL # type: ignore + + +class FunctionToolCallItemResource(ItemResource, discriminator="function_call"): + """A tool call to run a function. See the + `function calling guide `_ for more information. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION_CALL + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar call_id: The unique ID of the function tool call generated by the model. Required. + :vartype call_id: str + :ivar name: The name of the function to run. Required. + :vartype name: str + :ivar arguments: A JSON string of the arguments to pass to the function. Required. + :vartype arguments: str + """ + + type: Literal[ItemType.FUNCTION_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"completed\"], Literal[\"incomplete\"]""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the function tool call generated by the model. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the arguments to pass to the function. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + call_id: str, + name: str, + arguments: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FUNCTION_CALL # type: ignore + + +class FunctionToolCallOutputItemParam(ItemParam, discriminator="function_call_output"): + """The output of a function tool call. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION_CALL_OUTPUT + :ivar call_id: The unique ID of the function tool call generated by the model. Required. + :vartype call_id: str + :ivar output: A JSON string of the output of the function tool call. Required. + :vartype output: str + """ + + type: Literal[ItemType.FUNCTION_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the function tool call generated by the model. Required.""" + output: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the output of the function tool call. Required.""" + + @overload + def __init__( + self, + *, + call_id: str, + output: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FUNCTION_CALL_OUTPUT # type: ignore + + +class FunctionToolCallOutputItemResource(ItemResource, discriminator="function_call_output"): + """The output of a function tool call. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION_CALL_OUTPUT + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar call_id: The unique ID of the function tool call generated by the model. Required. + :vartype call_id: str + :ivar output: A JSON string of the output of the function tool call. Required. + :vartype output: str + """ + + type: Literal[ItemType.FUNCTION_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"completed\"], Literal[\"incomplete\"]""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the function tool call generated by the model. Required.""" + output: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the output of the function tool call. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + call_id: str, + output: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.FUNCTION_CALL_OUTPUT # type: ignore + + +class HostedAgentDefinition(AgentDefinition, discriminator="hosted"): + """The hosted agent definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ImageBasedHostedAgentDefinition + + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig + :ivar kind: Required. + :vartype kind: str or ~azure.ai.projects.models.HOSTED + :ivar tools: An array of tools the hosted agent's model may call while generating a response. + You + can specify which tool to use by setting the ``tool_choice`` parameter. + :vartype tools: list[~azure.ai.projects.models.Tool] + :ivar container_protocol_versions: The protocols that the agent supports for ingress + communication of the containers. Required. + :vartype container_protocol_versions: list[~azure.ai.projects.models.ProtocolVersionRecord] + :ivar cpu: The CPU configuration for the hosted agent. Required. + :vartype cpu: str + :ivar memory: The memory configuration for the hosted agent. Required. + :vartype memory: str + :ivar environment_variables: Environment variables to set in the hosted agent container. + :vartype environment_variables: dict[str, str] + """ + + __mapping__: dict[str, _Model] = {} + kind: Literal[AgentKind.HOSTED] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + tools: Optional[list["_models.Tool"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An array of tools the hosted agent's model may call while generating a response. You + can specify which tool to use by setting the ``tool_choice`` parameter.""" + container_protocol_versions: list["_models.ProtocolVersionRecord"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The protocols that the agent supports for ingress communication of the containers. Required.""" + cpu: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The CPU configuration for the hosted agent. Required.""" + memory: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The memory configuration for the hosted agent. Required.""" + environment_variables: Optional[dict[str, str]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Environment variables to set in the hosted agent container.""" + + @overload + def __init__( + self, + *, + container_protocol_versions: list["_models.ProtocolVersionRecord"], + cpu: str, + memory: str, + rai_config: Optional["_models.RaiConfig"] = None, + tools: Optional[list["_models.Tool"]] = None, + environment_variables: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = AgentKind.HOSTED # type: ignore + + +class HourlyRecurrenceSchedule(RecurrenceSchedule, discriminator="Hourly"): + """Hourly recurrence schedule. + + :ivar type: Required. Hourly recurrence pattern. + :vartype type: str or ~azure.ai.projects.models.HOURLY + """ + + type: Literal[RecurrenceType.HOURLY] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Hourly recurrence pattern.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = RecurrenceType.HOURLY # type: ignore + + +class HumanEvaluationRuleAction(EvaluationRuleAction, discriminator="humanEvaluation"): + """Evaluation rule action for human evaluation. + + :ivar type: Required. Human evaluation. + :vartype type: str or ~azure.ai.projects.models.HUMAN_EVALUATION + :ivar template_id: Human evaluation template Id. Required. + :vartype template_id: str + """ + + type: Literal[EvaluationRuleActionType.HUMAN_EVALUATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Human evaluation.""" + template_id: str = rest_field(name="templateId", visibility=["read", "create", "update", "delete", "query"]) + """Human evaluation template Id. Required.""" + + @overload + def __init__( + self, + *, + template_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = EvaluationRuleActionType.HUMAN_EVALUATION # type: ignore + + +class ImageBasedHostedAgentDefinition(HostedAgentDefinition, discriminator="hosted"): + """The image-based deployment definition for a hosted agent. + + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig + :ivar tools: An array of tools the hosted agent's model may call while generating a response. + You + can specify which tool to use by setting the ``tool_choice`` parameter. + :vartype tools: list[~azure.ai.projects.models.Tool] + :ivar container_protocol_versions: The protocols that the agent supports for ingress + communication of the containers. Required. + :vartype container_protocol_versions: list[~azure.ai.projects.models.ProtocolVersionRecord] + :ivar cpu: The CPU configuration for the hosted agent. Required. + :vartype cpu: str + :ivar memory: The memory configuration for the hosted agent. Required. + :vartype memory: str + :ivar environment_variables: Environment variables to set in the hosted agent container. + :vartype environment_variables: dict[str, str] + :ivar kind: Required. + :vartype kind: str or ~azure.ai.projects.models.HOSTED + :ivar image: The image for the hosted agent. Required. + :vartype image: str + """ + + image: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The image for the hosted agent. Required.""" + + @overload + def __init__( + self, + *, + container_protocol_versions: list["_models.ProtocolVersionRecord"], + cpu: str, + memory: str, + image: str, + rai_config: Optional["_models.RaiConfig"] = None, + tools: Optional[list["_models.Tool"]] = None, + environment_variables: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ImageGenTool(Tool, discriminator="image_generation"): + """A tool that generates images using a model like ``gpt-image-1``. + + :ivar type: The type of the image generation tool. Always ``image_generation``. Required. + :vartype type: str or ~azure.ai.projects.models.IMAGE_GENERATION + :ivar model: The image generation model to use. Default: ``gpt-image-1``. Default value is + "gpt-image-1". + :vartype model: str + :ivar quality: The quality of the generated image. One of ``low``, ``medium``, ``high``, + or ``auto``. Default: ``auto``. Is one of the following types: Literal["low"], + Literal["medium"], Literal["high"], Literal["auto"] + :vartype quality: str or str or str or str + :ivar size: The size of the generated image. One of ``1024x1024``, ``1024x1536``, + ``1536x1024``, or ``auto``. Default: ``auto``. Is one of the following types: + Literal["1024x1024"], Literal["1024x1536"], Literal["1536x1024"], Literal["auto"] + :vartype size: str or str or str or str + :ivar output_format: The output format of the generated image. One of ``png``, ``webp``, or + ``jpeg``. Default: ``png``. Is one of the following types: Literal["png"], Literal["webp"], + Literal["jpeg"] + :vartype output_format: str or str or str + :ivar output_compression: Compression level for the output image. Default: 100. + :vartype output_compression: int + :ivar moderation: Moderation level for the generated image. Default: ``auto``. Is either a + Literal["auto"] type or a Literal["low"] type. + :vartype moderation: str or str + :ivar background: Background type for the generated image. One of ``transparent``, + ``opaque``, or ``auto``. Default: ``auto``. Is one of the following types: + Literal["transparent"], Literal["opaque"], Literal["auto"] + :vartype background: str or str or str + :ivar input_image_mask: Optional mask for inpainting. Contains ``image_url`` + (string, optional) and ``file_id`` (string, optional). + :vartype input_image_mask: ~azure.ai.projects.models.ImageGenToolInputImageMask + :ivar partial_images: Number of partial images to generate in streaming mode, from 0 (default + value) to 3. + :vartype partial_images: int + """ + + type: Literal[ToolType.IMAGE_GENERATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the image generation tool. Always ``image_generation``. Required.""" + model: Optional[Literal["gpt-image-1"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The image generation model to use. Default: ``gpt-image-1``. Default value is \"gpt-image-1\".""" + quality: Optional[Literal["low", "medium", "high", "auto"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The quality of the generated image. One of ``low``, ``medium``, ``high``, + or ``auto``. Default: ``auto``. Is one of the following types: Literal[\"low\"], + Literal[\"medium\"], Literal[\"high\"], Literal[\"auto\"]""" + size: Optional[Literal["1024x1024", "1024x1536", "1536x1024", "auto"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The size of the generated image. One of ``1024x1024``, ``1024x1536``, + ``1536x1024``, or ``auto``. Default: ``auto``. Is one of the following types: + Literal[\"1024x1024\"], Literal[\"1024x1536\"], Literal[\"1536x1024\"], Literal[\"auto\"]""" + output_format: Optional[Literal["png", "webp", "jpeg"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The output format of the generated image. One of ``png``, ``webp``, or + ``jpeg``. Default: ``png``. Is one of the following types: Literal[\"png\"], Literal[\"webp\"], + Literal[\"jpeg\"]""" + output_compression: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Compression level for the output image. Default: 100.""" + moderation: Optional[Literal["auto", "low"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Moderation level for the generated image. Default: ``auto``. Is either a Literal[\"auto\"] type + or a Literal[\"low\"] type.""" + background: Optional[Literal["transparent", "opaque", "auto"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Background type for the generated image. One of ``transparent``, + ``opaque``, or ``auto``. Default: ``auto``. Is one of the following types: + Literal[\"transparent\"], Literal[\"opaque\"], Literal[\"auto\"]""" + input_image_mask: Optional["_models.ImageGenToolInputImageMask"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Optional mask for inpainting. Contains ``image_url`` + (string, optional) and ``file_id`` (string, optional).""" + partial_images: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Number of partial images to generate in streaming mode, from 0 (default value) to 3.""" + + @overload + def __init__( + self, + *, + model: Optional[Literal["gpt-image-1"]] = None, + quality: Optional[Literal["low", "medium", "high", "auto"]] = None, + size: Optional[Literal["1024x1024", "1024x1536", "1536x1024", "auto"]] = None, + output_format: Optional[Literal["png", "webp", "jpeg"]] = None, + output_compression: Optional[int] = None, + moderation: Optional[Literal["auto", "low"]] = None, + background: Optional[Literal["transparent", "opaque", "auto"]] = None, + input_image_mask: Optional["_models.ImageGenToolInputImageMask"] = None, + partial_images: Optional[int] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.IMAGE_GENERATION # type: ignore + + +class ImageGenToolCallItemParam(ItemParam, discriminator="image_generation_call"): + """An image generation request made by the model. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.IMAGE_GENERATION_CALL + :ivar result: The generated image encoded in base64. Required. + :vartype result: str + """ + + type: Literal[ItemType.IMAGE_GENERATION_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + result: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The generated image encoded in base64. Required.""" + + @overload + def __init__( + self, + *, + result: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.IMAGE_GENERATION_CALL # type: ignore + + +class ImageGenToolCallItemResource(ItemResource, discriminator="image_generation_call"): + """An image generation request made by the model. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.IMAGE_GENERATION_CALL + :ivar status: Required. Is one of the following types: Literal["in_progress"], + Literal["completed"], Literal["generating"], Literal["failed"] + :vartype status: str or str or str or str + :ivar result: The generated image encoded in base64. Required. + :vartype result: str + """ + + type: Literal[ItemType.IMAGE_GENERATION_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "generating", "failed"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required. Is one of the following types: Literal[\"in_progress\"], Literal[\"completed\"], + Literal[\"generating\"], Literal[\"failed\"]""" + result: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The generated image encoded in base64. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "generating", "failed"], + result: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.IMAGE_GENERATION_CALL # type: ignore + + +class ImageGenToolInputImageMask(_Model): + """ImageGenToolInputImageMask. + + :ivar image_url: Base64-encoded mask image. + :vartype image_url: str + :ivar file_id: File ID for the mask image. + :vartype file_id: str + """ + + image_url: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Base64-encoded mask image.""" + file_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """File ID for the mask image.""" + + @overload + def __init__( + self, + *, + image_url: Optional[str] = None, + file_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Insight(_Model): + """The response body for cluster insights. + + :ivar id: The unique identifier for the insights report. Required. + :vartype id: str + :ivar metadata: Metadata about the insights report. Required. + :vartype metadata: ~azure.ai.projects.models.InsightsMetadata + :ivar state: The current state of the insights. Required. Known values are: "NotStarted", + "Running", "Succeeded", "Failed", and "Canceled". + :vartype state: str or ~azure.ai.projects.models.OperationState + :ivar display_name: User friendly display name for the insight. Required. + :vartype display_name: str + :ivar request: Request for the insights analysis. Required. + :vartype request: ~azure.ai.projects.models.InsightRequest + :ivar result: The result of the insights report. + :vartype result: ~azure.ai.projects.models.InsightResult + """ + + id: str = rest_field(visibility=["read"]) + """The unique identifier for the insights report. Required.""" + metadata: "_models.InsightsMetadata" = rest_field(visibility=["read"]) + """Metadata about the insights report. Required.""" + state: Union[str, "_models.OperationState"] = rest_field(visibility=["read"]) + """The current state of the insights. Required. Known values are: \"NotStarted\", \"Running\", + \"Succeeded\", \"Failed\", and \"Canceled\".""" + display_name: str = rest_field(name="displayName", visibility=["read", "create", "update", "delete", "query"]) + """User friendly display name for the insight. Required.""" + request: "_models.InsightRequest" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Request for the insights analysis. Required.""" + result: Optional["_models.InsightResult"] = rest_field(visibility=["read"]) + """The result of the insights report.""" + + @overload + def __init__( + self, + *, + display_name: str, + request: "_models.InsightRequest", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class InsightCluster(_Model): + """A cluster of analysis samples. + + :ivar id: The id of the analysis cluster. Required. + :vartype id: str + :ivar label: Label for the cluster. Required. + :vartype label: str + :ivar suggestion: Suggestion for the cluster. Required. + :vartype suggestion: str + :ivar description: Description of the analysis cluster. Required. + :vartype description: str + :ivar weight: The weight of the analysis cluster. This indicate number of samples in the + cluster. Required. + :vartype weight: int + :ivar sub_clusters: List of subclusters within this cluster. Empty if no subclusters exist. + :vartype sub_clusters: list[~azure.ai.projects.models.InsightCluster] + :ivar samples: List of samples that belong to this cluster. Empty if samples are part of + subclusters. + :vartype samples: list[~azure.ai.projects.models.InsightSample] + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The id of the analysis cluster. Required.""" + label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Label for the cluster. Required.""" + suggestion: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Suggestion for the cluster. Required.""" + description: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the analysis cluster. Required.""" + weight: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The weight of the analysis cluster. This indicate number of samples in the cluster. Required.""" + sub_clusters: Optional[list["_models.InsightCluster"]] = rest_field( + name="subClusters", visibility=["read", "create", "update", "delete", "query"] + ) + """List of subclusters within this cluster. Empty if no subclusters exist.""" + samples: Optional[list["_models.InsightSample"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """List of samples that belong to this cluster. Empty if samples are part of subclusters.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + label: str, + suggestion: str, + description: str, + weight: int, + sub_clusters: Optional[list["_models.InsightCluster"]] = None, + samples: Optional[list["_models.InsightSample"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class InsightModelConfiguration(_Model): + """Configuration of the model used in the insight generation. + + :ivar model_deployment_name: The model deployment to be evaluated. Accepts either the + deployment name alone or with the connection name as '{connectionName}/'. + Required. + :vartype model_deployment_name: str + """ + + model_deployment_name: str = rest_field( + name="modelDeploymentName", visibility=["read", "create", "update", "delete", "query"] + ) + """The model deployment to be evaluated. Accepts either the deployment name alone or with the + connection name as '{connectionName}/'. Required.""" + + @overload + def __init__( + self, + *, + model_deployment_name: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class InsightScheduleTask(ScheduleTask, discriminator="Insight"): + """Insight task for the schedule. + + :ivar configuration: Configuration for the task. + :vartype configuration: dict[str, str] + :ivar type: Required. Insight task. + :vartype type: str or ~azure.ai.projects.models.INSIGHT + :ivar insight: The insight payload. Required. + :vartype insight: ~azure.ai.projects.models.Insight + """ + + type: Literal[ScheduleTaskType.INSIGHT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Insight task.""" + insight: "_models.Insight" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The insight payload. Required.""" + + @overload + def __init__( + self, + *, + insight: "_models.Insight", + configuration: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ScheduleTaskType.INSIGHT # type: ignore + + +class InsightsMetadata(_Model): + """Metadata about the insights. + + :ivar created_at: The timestamp when the insights were created. Required. + :vartype created_at: ~datetime.datetime + :ivar completed_at: The timestamp when the insights were completed. + :vartype completed_at: ~datetime.datetime + """ + + created_at: datetime.datetime = rest_field( + name="createdAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339" + ) + """The timestamp when the insights were created. Required.""" + completed_at: Optional[datetime.datetime] = rest_field( + name="completedAt", visibility=["read", "create", "update", "delete", "query"], format="rfc3339" + ) + """The timestamp when the insights were completed.""" + + @overload + def __init__( + self, + *, + created_at: datetime.datetime, + completed_at: Optional[datetime.datetime] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class InsightSummary(_Model): + """Summary of the error cluster analysis. + + :ivar sample_count: Total number of samples analyzed. Required. + :vartype sample_count: int + :ivar unique_subcluster_count: Total number of unique subcluster labels. Required. + :vartype unique_subcluster_count: int + :ivar unique_cluster_count: Total number of unique clusters. Required. + :vartype unique_cluster_count: int + :ivar method: Method used for clustering. Required. + :vartype method: str + :ivar usage: Token usage while performing clustering analysis. Required. + :vartype usage: ~azure.ai.projects.models.ClusterTokenUsage + """ + + sample_count: int = rest_field(name="sampleCount", visibility=["read", "create", "update", "delete", "query"]) + """Total number of samples analyzed. Required.""" + unique_subcluster_count: int = rest_field( + name="uniqueSubclusterCount", visibility=["read", "create", "update", "delete", "query"] + ) + """Total number of unique subcluster labels. Required.""" + unique_cluster_count: int = rest_field( + name="uniqueClusterCount", visibility=["read", "create", "update", "delete", "query"] + ) + """Total number of unique clusters. Required.""" + method: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Method used for clustering. Required.""" + usage: "_models.ClusterTokenUsage" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Token usage while performing clustering analysis. Required.""" + + @overload + def __init__( + self, + *, + sample_count: int, + unique_subcluster_count: int, + unique_cluster_count: int, + method: str, + usage: "_models.ClusterTokenUsage", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class WorkflowActionOutputItemResource(ItemResource, discriminator="workflow_action"): + """WorkflowActionOutputItemResource. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + InvokeAzureAgentWorkflowActionOutputItemResource + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.WORKFLOW_ACTION + :ivar kind: The kind of CSDL action (e.g., 'SetVariable', 'InvokeAzureAgent'). Required. + Default value is None. + :vartype kind: str + :ivar action_id: Unique identifier for the action. Required. + :vartype action_id: str + :ivar parent_action_id: ID of the parent action if this is a nested action. + :vartype parent_action_id: str + :ivar previous_action_id: ID of the previous action if this action follows another. + :vartype previous_action_id: str + :ivar status: Status of the action (e.g., 'in_progress', 'completed', 'failed', 'cancelled'). + Required. Is one of the following types: Literal["completed"], Literal["failed"], + Literal["in_progress"], Literal["cancelled"] + :vartype status: str or str or str or str + """ + + __mapping__: dict[str, _Model] = {} + type: Literal[ItemType.WORKFLOW_ACTION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + kind: str = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) + """The kind of CSDL action (e.g., 'SetVariable', 'InvokeAzureAgent'). Required. Default value is + None.""" + action_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique identifier for the action. Required.""" + parent_action_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """ID of the parent action if this is a nested action.""" + previous_action_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """ID of the previous action if this action follows another.""" + status: Literal["completed", "failed", "in_progress", "cancelled"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Status of the action (e.g., 'in_progress', 'completed', 'failed', 'cancelled'). Required. Is + one of the following types: Literal[\"completed\"], Literal[\"failed\"], + Literal[\"in_progress\"], Literal[\"cancelled\"]""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + kind: str, + action_id: str, + status: Literal["completed", "failed", "in_progress", "cancelled"], + created_by: Optional["_models.CreatedBy"] = None, + parent_action_id: Optional[str] = None, + previous_action_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.WORKFLOW_ACTION # type: ignore + + +class InvokeAzureAgentWorkflowActionOutputItemResource( + WorkflowActionOutputItemResource, discriminator="InvokeAzureAgent" +): # pylint: disable=name-too-long + """Details about an agent invocation as part of a workflow action. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.WORKFLOW_ACTION + :ivar action_id: Unique identifier for the action. Required. + :vartype action_id: str + :ivar parent_action_id: ID of the parent action if this is a nested action. + :vartype parent_action_id: str + :ivar previous_action_id: ID of the previous action if this action follows another. + :vartype previous_action_id: str + :ivar status: Status of the action (e.g., 'in_progress', 'completed', 'failed', 'cancelled'). + Required. Is one of the following types: Literal["completed"], Literal["failed"], + Literal["in_progress"], Literal["cancelled"] + :vartype status: str or str or str or str + :ivar kind: Required. Default value is "InvokeAzureAgent". + :vartype kind: str + :ivar agent: Agent id. Required. + :vartype agent: ~azure.ai.projects.models.AgentId + :ivar conversation_id: ID of the conversation for the agent invocation. + :vartype conversation_id: str + :ivar response_id: The response id for the agent invocation. Required. + :vartype response_id: str + """ + + __mapping__: dict[str, _Model] = {} + kind: Literal["InvokeAzureAgent"] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Default value is \"InvokeAzureAgent\".""" + agent: "_models.AgentId" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Agent id. Required.""" + conversation_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """ID of the conversation for the agent invocation.""" + response_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response id for the agent invocation. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + action_id: str, + status: Literal["completed", "failed", "in_progress", "cancelled"], + agent: "_models.AgentId", + response_id: str, + created_by: Optional["_models.CreatedBy"] = None, + parent_action_id: Optional[str] = None, + previous_action_id: Optional[str] = None, + conversation_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = "InvokeAzureAgent" # type: ignore + + +class ItemContent(_Model): + """ItemContent. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ItemContentInputAudio, ItemContentInputFile, ItemContentInputImage, ItemContentInputText, + ItemContentOutputAudio, ItemContentOutputText, ItemContentRefusal + + :ivar type: Required. Known values are: "input_text", "input_audio", "input_image", + "input_file", "output_text", "output_audio", and "refusal". + :vartype type: str or ~azure.ai.projects.models.ItemContentType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"input_text\", \"input_audio\", \"input_image\", \"input_file\", + \"output_text\", \"output_audio\", and \"refusal\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ItemContentInputAudio(ItemContent, discriminator="input_audio"): + """An audio input to the model. + + :ivar type: The type of the input item. Always ``input_audio``. Required. + :vartype type: str or ~azure.ai.projects.models.INPUT_AUDIO + :ivar data: Base64-encoded audio data. Required. + :vartype data: str + :ivar format: The format of the audio data. Currently supported formats are ``mp3`` and + ``wav``. Required. Is either a Literal["mp3"] type or a Literal["wav"] type. + :vartype format: str or str + """ + + type: Literal[ItemContentType.INPUT_AUDIO] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the input item. Always ``input_audio``. Required.""" + data: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Base64-encoded audio data. Required.""" + format: Literal["mp3", "wav"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The format of the audio data. Currently supported formats are ``mp3`` and + ``wav``. Required. Is either a Literal[\"mp3\"] type or a Literal[\"wav\"] type.""" + + @overload + def __init__( + self, + *, + data: str, + format: Literal["mp3", "wav"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.INPUT_AUDIO # type: ignore + + +class ItemContentInputFile(ItemContent, discriminator="input_file"): + """A file input to the model. + + :ivar type: The type of the input item. Always ``input_file``. Required. + :vartype type: str or ~azure.ai.projects.models.INPUT_FILE + :ivar file_id: The ID of the file to be sent to the model. + :vartype file_id: str + :ivar filename: The name of the file to be sent to the model. + :vartype filename: str + :ivar file_data: The content of the file to be sent to the model. + :vartype file_data: str + """ + + type: Literal[ItemContentType.INPUT_FILE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the input item. Always ``input_file``. Required.""" + file_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the file to be sent to the model.""" + filename: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the file to be sent to the model.""" + file_data: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content of the file to be sent to the model.""" + + @overload + def __init__( + self, + *, + file_id: Optional[str] = None, + filename: Optional[str] = None, + file_data: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.INPUT_FILE # type: ignore + + +class ItemContentInputImage(ItemContent, discriminator="input_image"): + """An image input to the model. Learn about `image inputs `_. + + :ivar type: The type of the input item. Always ``input_image``. Required. + :vartype type: str or ~azure.ai.projects.models.INPUT_IMAGE + :ivar image_url: The URL of the image to be sent to the model. A fully qualified URL or base64 + encoded image in a data URL. + :vartype image_url: str + :ivar file_id: The ID of the file to be sent to the model. + :vartype file_id: str + :ivar detail: The detail level of the image to be sent to the model. One of ``high``, ``low``, + or ``auto``. Defaults to ``auto``. Is one of the following types: Literal["low"], + Literal["high"], Literal["auto"] + :vartype detail: str or str or str + """ + + type: Literal[ItemContentType.INPUT_IMAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the input item. Always ``input_image``. Required.""" + image_url: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL of the image to be sent to the model. A fully qualified URL or base64 encoded image in + a data URL.""" + file_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the file to be sent to the model.""" + detail: Optional[Literal["low", "high", "auto"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The detail level of the image to be sent to the model. One of ``high``, ``low``, or ``auto``. + Defaults to ``auto``. Is one of the following types: Literal[\"low\"], Literal[\"high\"], + Literal[\"auto\"]""" + + @overload + def __init__( + self, + *, + image_url: Optional[str] = None, + file_id: Optional[str] = None, + detail: Optional[Literal["low", "high", "auto"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.INPUT_IMAGE # type: ignore + + +class ItemContentInputText(ItemContent, discriminator="input_text"): + """A text input to the model. + + :ivar type: The type of the input item. Always ``input_text``. Required. + :vartype type: str or ~azure.ai.projects.models.INPUT_TEXT + :ivar text: The text input to the model. Required. + :vartype text: str + """ + + type: Literal[ItemContentType.INPUT_TEXT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the input item. Always ``input_text``. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text input to the model. Required.""" + + @overload + def __init__( + self, + *, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.INPUT_TEXT # type: ignore + + +class ItemContentOutputAudio(ItemContent, discriminator="output_audio"): + """An audio output from the model. + + :ivar type: The type of the output audio. Always ``output_audio``. Required. + :vartype type: str or ~azure.ai.projects.models.OUTPUT_AUDIO + :ivar data: Base64-encoded audio data from the model. Required. + :vartype data: str + :ivar transcript: The transcript of the audio data from the model. Required. + :vartype transcript: str + """ + + type: Literal[ItemContentType.OUTPUT_AUDIO] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the output audio. Always ``output_audio``. Required.""" + data: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Base64-encoded audio data from the model. Required.""" + transcript: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The transcript of the audio data from the model. Required.""" + + @overload + def __init__( + self, + *, + data: str, + transcript: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.OUTPUT_AUDIO # type: ignore + + +class ItemContentOutputText(ItemContent, discriminator="output_text"): + """A text output from the model. + + :ivar type: The type of the output text. Always ``output_text``. Required. + :vartype type: str or ~azure.ai.projects.models.OUTPUT_TEXT + :ivar text: The text output from the model. Required. + :vartype text: str + :ivar annotations: The annotations of the text output. Required. + :vartype annotations: list[~azure.ai.projects.models.Annotation] + :ivar logprobs: + :vartype logprobs: list[~azure.ai.projects.models.LogProb] + """ + + type: Literal[ItemContentType.OUTPUT_TEXT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the output text. Always ``output_text``. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text output from the model. Required.""" + annotations: list["_models.Annotation"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The annotations of the text output. Required.""" + logprobs: Optional[list["_models.LogProb"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + + @overload + def __init__( + self, + *, + text: str, + annotations: list["_models.Annotation"], + logprobs: Optional[list["_models.LogProb"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.OUTPUT_TEXT # type: ignore + + +class ItemContentRefusal(ItemContent, discriminator="refusal"): + """A refusal from the model. + + :ivar type: The type of the refusal. Always ``refusal``. Required. + :vartype type: str or ~azure.ai.projects.models.REFUSAL + :ivar refusal: The refusal explanationfrom the model. Required. + :vartype refusal: str + """ + + type: Literal[ItemContentType.REFUSAL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the refusal. Always ``refusal``. Required.""" + refusal: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The refusal explanationfrom the model. Required.""" + + @overload + def __init__( + self, + *, + refusal: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemContentType.REFUSAL # type: ignore + + +class ItemReferenceItemParam(ItemParam, discriminator="item_reference"): + """An internal identifier for an item to reference. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.ITEM_REFERENCE + :ivar id: The service-originated ID of the previously generated response item being referenced. + Required. + :vartype id: str + """ + + type: Literal[ItemType.ITEM_REFERENCE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The service-originated ID of the previously generated response item being referenced. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.ITEM_REFERENCE # type: ignore + + +class LocalShellExecAction(_Model): + """Execute a shell command on the server. + + :ivar type: The type of the local shell action. Always ``exec``. Required. Default value is + "exec". + :vartype type: str + :ivar command: The command to run. Required. + :vartype command: list[str] + :ivar timeout_ms: Optional timeout in milliseconds for the command. + :vartype timeout_ms: int + :ivar working_directory: Optional working directory to run the command in. + :vartype working_directory: str + :ivar env: Environment variables to set for the command. Required. + :vartype env: dict[str, str] + :ivar user: Optional user to run the command as. + :vartype user: str + """ + + type: Literal["exec"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The type of the local shell action. Always ``exec``. Required. Default value is \"exec\".""" + command: list[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The command to run. Required.""" + timeout_ms: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional timeout in milliseconds for the command.""" + working_directory: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional working directory to run the command in.""" + env: dict[str, str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Environment variables to set for the command. Required.""" + user: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional user to run the command as.""" + + @overload + def __init__( + self, + *, + command: list[str], + env: dict[str, str], + timeout_ms: Optional[int] = None, + working_directory: Optional[str] = None, + user: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["exec"] = "exec" + + +class LocalShellTool(Tool, discriminator="local_shell"): + """A tool that allows the model to execute shell commands in a local environment. + + :ivar type: The type of the local shell tool. Always ``local_shell``. Required. + :vartype type: str or ~azure.ai.projects.models.LOCAL_SHELL + """ + + type: Literal[ToolType.LOCAL_SHELL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the local shell tool. Always ``local_shell``. Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.LOCAL_SHELL # type: ignore + + +class LocalShellToolCallItemParam(ItemParam, discriminator="local_shell_call"): + """A tool call to run a command on the local shell. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.LOCAL_SHELL_CALL + :ivar call_id: The unique ID of the local shell tool call generated by the model. Required. + :vartype call_id: str + :ivar action: Required. + :vartype action: ~azure.ai.projects.models.LocalShellExecAction + """ + + type: Literal[ItemType.LOCAL_SHELL_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the local shell tool call generated by the model. Required.""" + action: "_models.LocalShellExecAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + call_id: str, + action: "_models.LocalShellExecAction", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.LOCAL_SHELL_CALL # type: ignore + + +class LocalShellToolCallItemResource(ItemResource, discriminator="local_shell_call"): + """A tool call to run a command on the local shell. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.LOCAL_SHELL_CALL + :ivar status: Required. Is one of the following types: Literal["in_progress"], + Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar call_id: The unique ID of the local shell tool call generated by the model. Required. + :vartype call_id: str + :ivar action: Required. + :vartype action: ~azure.ai.projects.models.LocalShellExecAction + """ + + type: Literal[ItemType.LOCAL_SHELL_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required. Is one of the following types: Literal[\"in_progress\"], Literal[\"completed\"], + Literal[\"incomplete\"]""" + call_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the local shell tool call generated by the model. Required.""" + action: "_models.LocalShellExecAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + call_id: str, + action: "_models.LocalShellExecAction", + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.LOCAL_SHELL_CALL # type: ignore + + +class LocalShellToolCallOutputItemParam(ItemParam, discriminator="local_shell_call_output"): + """The output of a local shell tool call. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.LOCAL_SHELL_CALL_OUTPUT + :ivar output: A JSON string of the output of the local shell tool call. Required. + :vartype output: str + """ + + type: Literal[ItemType.LOCAL_SHELL_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + output: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the output of the local shell tool call. Required.""" + + @overload + def __init__( + self, + *, + output: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.LOCAL_SHELL_CALL_OUTPUT # type: ignore + + +class LocalShellToolCallOutputItemResource(ItemResource, discriminator="local_shell_call_output"): + """The output of a local shell tool call. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.LOCAL_SHELL_CALL_OUTPUT + :ivar status: Required. Is one of the following types: Literal["in_progress"], + Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar output: A JSON string of the output of the local shell tool call. Required. + :vartype output: str + """ + + type: Literal[ItemType.LOCAL_SHELL_CALL_OUTPUT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required. Is one of the following types: Literal[\"in_progress\"], Literal[\"completed\"], + Literal[\"incomplete\"]""" + output: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the output of the local shell tool call. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + output: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.LOCAL_SHELL_CALL_OUTPUT # type: ignore + + +class LogProb(_Model): + """The log probability of a token. + + :ivar token: Required. + :vartype token: str + :ivar logprob: Required. + :vartype logprob: float + :ivar bytes: Required. + :vartype bytes: list[int] + :ivar top_logprobs: Required. + :vartype top_logprobs: list[~azure.ai.projects.models.TopLogProb] + """ + + token: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + logprob: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + bytes: list[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + top_logprobs: list["_models.TopLogProb"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + token: str, + logprob: float, + bytes: list[int], + top_logprobs: list["_models.TopLogProb"], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ManagedAzureAISearchIndex(Index, discriminator="ManagedAzureSearch"): + """Managed Azure AI Search Index Definition. + + :ivar id: Asset ID, a unique identifier for the asset. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. Managed Azure Search + :vartype type: str or ~azure.ai.projects.models.MANAGED_AZURE_SEARCH + :ivar vector_store_id: Vector store id of managed index. Required. + :vartype vector_store_id: str + """ + + type: Literal[IndexType.MANAGED_AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. Managed Azure Search""" + vector_store_id: str = rest_field(name="vectorStoreId", visibility=["create"]) + """Vector store id of managed index. Required.""" + + @overload + def __init__( + self, + *, + vector_store_id: str, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = IndexType.MANAGED_AZURE_SEARCH # type: ignore + + +class MCPApprovalRequestItemParam(ItemParam, discriminator="mcp_approval_request"): + """A request for human approval of a tool invocation. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_APPROVAL_REQUEST + :ivar server_label: The label of the MCP server making the request. Required. + :vartype server_label: str + :ivar name: The name of the tool to run. Required. + :vartype name: str + :ivar arguments: A JSON string of arguments for the tool. Required. + :vartype arguments: str + """ + + type: Literal[ItemType.MCP_APPROVAL_REQUEST] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server making the request. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool to run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of arguments for the tool. Required.""" + + @overload + def __init__( + self, + *, + server_label: str, + name: str, + arguments: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_APPROVAL_REQUEST # type: ignore + + +class MCPApprovalRequestItemResource(ItemResource, discriminator="mcp_approval_request"): + """A request for human approval of a tool invocation. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_APPROVAL_REQUEST + :ivar server_label: The label of the MCP server making the request. Required. + :vartype server_label: str + :ivar name: The name of the tool to run. Required. + :vartype name: str + :ivar arguments: A JSON string of arguments for the tool. Required. + :vartype arguments: str + """ + + type: Literal[ItemType.MCP_APPROVAL_REQUEST] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server making the request. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool to run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of arguments for the tool. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + server_label: str, + name: str, + arguments: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_APPROVAL_REQUEST # type: ignore + + +class MCPApprovalResponseItemParam(ItemParam, discriminator="mcp_approval_response"): + """A response to an MCP approval request. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_APPROVAL_RESPONSE + :ivar approval_request_id: The ID of the approval request being answered. Required. + :vartype approval_request_id: str + :ivar approve: Whether the request was approved. Required. + :vartype approve: bool + :ivar reason: Optional reason for the decision. + :vartype reason: str + """ + + type: Literal[ItemType.MCP_APPROVAL_RESPONSE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + approval_request_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the approval request being answered. Required.""" + approve: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the request was approved. Required.""" + reason: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional reason for the decision.""" + + @overload + def __init__( + self, + *, + approval_request_id: str, + approve: bool, + reason: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_APPROVAL_RESPONSE # type: ignore + + +class MCPApprovalResponseItemResource(ItemResource, discriminator="mcp_approval_response"): + """A response to an MCP approval request. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_APPROVAL_RESPONSE + :ivar approval_request_id: The ID of the approval request being answered. Required. + :vartype approval_request_id: str + :ivar approve: Whether the request was approved. Required. + :vartype approve: bool + :ivar reason: Optional reason for the decision. + :vartype reason: str + """ + + type: Literal[ItemType.MCP_APPROVAL_RESPONSE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + approval_request_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the approval request being answered. Required.""" + approve: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the request was approved. Required.""" + reason: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional reason for the decision.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + approval_request_id: str, + approve: bool, + created_by: Optional["_models.CreatedBy"] = None, + reason: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_APPROVAL_RESPONSE # type: ignore + + +class MCPCallItemParam(ItemParam, discriminator="mcp_call"): + """An invocation of a tool on an MCP server. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_CALL + :ivar server_label: The label of the MCP server running the tool. Required. + :vartype server_label: str + :ivar name: The name of the tool that was run. Required. + :vartype name: str + :ivar arguments: A JSON string of the arguments passed to the tool. Required. + :vartype arguments: str + :ivar output: The output from the tool call. + :vartype output: str + :ivar error: The error from the tool call, if any. + :vartype error: str + """ + + type: Literal[ItemType.MCP_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server running the tool. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool that was run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the arguments passed to the tool. Required.""" + output: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The output from the tool call.""" + error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error from the tool call, if any.""" + + @overload + def __init__( + self, + *, + server_label: str, + name: str, + arguments: str, + output: Optional[str] = None, + error: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_CALL # type: ignore + + +class MCPCallItemResource(ItemResource, discriminator="mcp_call"): + """An invocation of a tool on an MCP server. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_CALL + :ivar server_label: The label of the MCP server running the tool. Required. + :vartype server_label: str + :ivar name: The name of the tool that was run. Required. + :vartype name: str + :ivar arguments: A JSON string of the arguments passed to the tool. Required. + :vartype arguments: str + :ivar output: The output from the tool call. + :vartype output: str + :ivar error: The error from the tool call, if any. + :vartype error: str + """ + + type: Literal[ItemType.MCP_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server running the tool. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool that was run. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A JSON string of the arguments passed to the tool. Required.""" + output: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The output from the tool call.""" + error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error from the tool call, if any.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + server_label: str, + name: str, + arguments: str, + created_by: Optional["_models.CreatedBy"] = None, + output: Optional[str] = None, + error: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_CALL # type: ignore + + +class MCPListToolsItemParam(ItemParam, discriminator="mcp_list_tools"): + """A list of tools available on an MCP server. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_LIST_TOOLS + :ivar server_label: The label of the MCP server. Required. + :vartype server_label: str + :ivar tools: The tools available on the server. Required. + :vartype tools: list[~azure.ai.projects.models.MCPListToolsTool] + :ivar error: Error message if the server could not list tools. + :vartype error: str + """ + + type: Literal[ItemType.MCP_LIST_TOOLS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server. Required.""" + tools: list["_models.MCPListToolsTool"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The tools available on the server. Required.""" + error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Error message if the server could not list tools.""" + + @overload + def __init__( + self, + *, + server_label: str, + tools: list["_models.MCPListToolsTool"], + error: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_LIST_TOOLS # type: ignore + + +class MCPListToolsItemResource(ItemResource, discriminator="mcp_list_tools"): + """A list of tools available on an MCP server. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MCP_LIST_TOOLS + :ivar server_label: The label of the MCP server. Required. + :vartype server_label: str + :ivar tools: The tools available on the server. Required. + :vartype tools: list[~azure.ai.projects.models.MCPListToolsTool] + :ivar error: Error message if the server could not list tools. + :vartype error: str + """ + + type: Literal[ItemType.MCP_LIST_TOOLS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server. Required.""" + tools: list["_models.MCPListToolsTool"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The tools available on the server. Required.""" + error: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Error message if the server could not list tools.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + server_label: str, + tools: list["_models.MCPListToolsTool"], + created_by: Optional["_models.CreatedBy"] = None, + error: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MCP_LIST_TOOLS # type: ignore + + +class MCPListToolsTool(_Model): + """A tool available on an MCP server. + + :ivar name: The name of the tool. Required. + :vartype name: str + :ivar description: The description of the tool. + :vartype description: str + :ivar input_schema: The JSON schema describing the tool's input. Required. + :vartype input_schema: any + :ivar annotations: Additional annotations about the tool. + :vartype annotations: any + """ + + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The description of the tool.""" + input_schema: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The JSON schema describing the tool's input. Required.""" + annotations: Optional[Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Additional annotations about the tool.""" + + @overload + def __init__( + self, + *, + name: str, + input_schema: Any, + description: Optional[str] = None, + annotations: Optional[Any] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MCPTool(Tool, discriminator="mcp"): + """Give the model access to additional tools via remote Model Context Protocol + (MCP) servers. `Learn more about MCP `_. + + :ivar type: The type of the MCP tool. Always ``mcp``. Required. + :vartype type: str or ~azure.ai.projects.models.MCP + :ivar server_label: A label for this MCP server, used to identify it in tool calls. Required. + :vartype server_label: str + :ivar server_url: The URL for the MCP server. Required. + :vartype server_url: str + :ivar headers: Optional HTTP headers to send to the MCP server. Use for authentication + or other purposes. + :vartype headers: dict[str, str] + :ivar allowed_tools: List of allowed tool names or a filter object. Is either a [str] type or a + MCPToolAllowedTools1 type. + :vartype allowed_tools: list[str] or ~azure.ai.projects.models.MCPToolAllowedTools1 + :ivar require_approval: Specify which of the MCP server's tools require approval. Is one of the + following types: MCPToolRequireApproval1, Literal["always"], Literal["never"] + :vartype require_approval: ~azure.ai.projects.models.MCPToolRequireApproval1 or str or str + :ivar project_connection_id: The connection ID in the project for the MCP server. The + connection stores authentication and other connection details needed to connect to the MCP + server. + :vartype project_connection_id: str + """ + + type: Literal[ToolType.MCP] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the MCP tool. Always ``mcp``. Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A label for this MCP server, used to identify it in tool calls. Required.""" + server_url: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL for the MCP server. Required.""" + headers: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional HTTP headers to send to the MCP server. Use for authentication + or other purposes.""" + allowed_tools: Optional[Union[list[str], "_models.MCPToolAllowedTools1"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """List of allowed tool names or a filter object. Is either a [str] type or a MCPToolAllowedTools1 + type.""" + require_approval: Optional[Union["_models.MCPToolRequireApproval1", Literal["always"], Literal["never"]]] = ( + rest_field(visibility=["read", "create", "update", "delete", "query"]) + ) + """Specify which of the MCP server's tools require approval. Is one of the following types: + MCPToolRequireApproval1, Literal[\"always\"], Literal[\"never\"]""" + project_connection_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The connection ID in the project for the MCP server. The connection stores authentication and + other connection details needed to connect to the MCP server.""" + + @overload + def __init__( + self, + *, + server_label: str, + server_url: str, + headers: Optional[dict[str, str]] = None, + allowed_tools: Optional[Union[list[str], "_models.MCPToolAllowedTools1"]] = None, + require_approval: Optional[ + Union["_models.MCPToolRequireApproval1", Literal["always"], Literal["never"]] + ] = None, + project_connection_id: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.MCP # type: ignore + + +class MCPToolAllowedTools1(_Model): + """MCPToolAllowedTools1. + + :ivar tool_names: List of allowed tool names. + :vartype tool_names: list[str] + """ + + tool_names: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of allowed tool names.""" + + @overload + def __init__( + self, + *, + tool_names: Optional[list[str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MCPToolRequireApproval1(_Model): + """MCPToolRequireApproval1. + + :ivar always: A list of tools that always require approval. + :vartype always: ~azure.ai.projects.models.MCPToolRequireApprovalAlways + :ivar never: A list of tools that never require approval. + :vartype never: ~azure.ai.projects.models.MCPToolRequireApprovalNever + """ + + always: Optional["_models.MCPToolRequireApprovalAlways"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A list of tools that always require approval.""" + never: Optional["_models.MCPToolRequireApprovalNever"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A list of tools that never require approval.""" + + @overload + def __init__( + self, + *, + always: Optional["_models.MCPToolRequireApprovalAlways"] = None, + never: Optional["_models.MCPToolRequireApprovalNever"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MCPToolRequireApprovalAlways(_Model): + """MCPToolRequireApprovalAlways. + + :ivar tool_names: List of tools that require approval. + :vartype tool_names: list[str] + """ + + tool_names: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of tools that require approval.""" + + @overload + def __init__( + self, + *, + tool_names: Optional[list[str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MCPToolRequireApprovalNever(_Model): + """MCPToolRequireApprovalNever. + + :ivar tool_names: List of tools that do not require approval. + :vartype tool_names: list[str] + """ + + tool_names: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of tools that do not require approval.""" + + @overload + def __init__( + self, + *, + tool_names: Optional[list[str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryOperation(_Model): + """Represents a single memory operation (create, update, or delete) performed on a memory item. + + :ivar kind: The type of memory operation being performed. Required. Known values are: "create", + "update", and "delete". + :vartype kind: str or ~azure.ai.projects.models.MemoryOperationKind + :ivar memory_item: The memory item to create, update, or delete. Required. + :vartype memory_item: ~azure.ai.projects.models.MemoryItem + """ + + kind: Union[str, "_models.MemoryOperationKind"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The type of memory operation being performed. Required. Known values are: \"create\", + \"update\", and \"delete\".""" + memory_item: "_models.MemoryItem" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The memory item to create, update, or delete. Required.""" + + @overload + def __init__( + self, + *, + kind: Union[str, "_models.MemoryOperationKind"], + memory_item: "_models.MemoryItem", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemorySearchItem(_Model): + """A retrieved memory item from memory search. + + :ivar memory_item: Retrieved memory item. Required. + :vartype memory_item: ~azure.ai.projects.models.MemoryItem + """ + + memory_item: "_models.MemoryItem" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Retrieved memory item. Required.""" + + @overload + def __init__( + self, + *, + memory_item: "_models.MemoryItem", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemorySearchOptions(_Model): + """Memory search options. + + :ivar max_memories: Maximum number of memory items to return. + :vartype max_memories: int + """ + + max_memories: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Maximum number of memory items to return.""" + + @overload + def __init__( + self, + *, + max_memories: Optional[int] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemorySearchTool(Tool, discriminator="memory_search"): + """A tool for integrating memories into the agent. + + :ivar type: The type of the tool. Always ``memory_search``. Required. + :vartype type: str or ~azure.ai.projects.models.MEMORY_SEARCH + :ivar memory_store_name: The name of the memory store to use. Required. + :vartype memory_store_name: str + :ivar scope: The namespace used to group and isolate memories, such as a user ID. + Limits which memories can be retrieved or updated. + Use special variable ``{{$userId}}`` to scope memories to the current signed-in user. Required. + :vartype scope: str + :ivar search_options: Options for searching the memory store. + :vartype search_options: ~azure.ai.projects.models.MemorySearchOptions + :ivar update_delay: The amount of time to wait after inactivity before updating memories with + messages from the call (e.g., '0s', '5m'). Defaults to '60s'. + :vartype update_delay: ~datetime.timedelta + """ + + type: Literal[ToolType.MEMORY_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the tool. Always ``memory_search``. Required.""" + memory_store_name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the memory store to use. Required.""" + scope: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The namespace used to group and isolate memories, such as a user ID. + Limits which memories can be retrieved or updated. + Use special variable ``{{$userId}}`` to scope memories to the current signed-in user. Required.""" + search_options: Optional["_models.MemorySearchOptions"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Options for searching the memory store.""" + update_delay: Optional[datetime.timedelta] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The amount of time to wait after inactivity before updating memories with messages from the + call (e.g., '0s', '5m'). Defaults to '60s'.""" + + @overload + def __init__( + self, + *, + memory_store_name: str, + scope: str, + search_options: Optional["_models.MemorySearchOptions"] = None, + update_delay: Optional[datetime.timedelta] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.MEMORY_SEARCH # type: ignore + + +class MemorySearchToolCallItemParam(ItemParam, discriminator="memory_search_call"): + """MemorySearchToolCallItemParam. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MEMORY_SEARCH_CALL + :ivar results: The results returned from the memory search. + :vartype results: list[~azure.ai.projects.models.MemorySearchItem] + """ + + type: Literal[ItemType.MEMORY_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + results: Optional[list["_models.MemorySearchItem"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The results returned from the memory search.""" + + @overload + def __init__( + self, + *, + results: Optional[list["_models.MemorySearchItem"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MEMORY_SEARCH_CALL # type: ignore + + +class MemorySearchToolCallItemResource(ItemResource, discriminator="memory_search_call"): + """MemorySearchToolCallItemResource. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.MEMORY_SEARCH_CALL + :ivar status: The status of the memory search tool call. One of ``in_progress``, + ``searching``, ``completed``, ``incomplete`` or ``failed``,. Required. Is one of the following + types: Literal["in_progress"], Literal["searching"], Literal["completed"], + Literal["incomplete"], Literal["failed"] + :vartype status: str or str or str or str or str + :ivar results: The results returned from the memory search. + :vartype results: list[~azure.ai.projects.models.MemorySearchItem] + """ + + type: Literal[ItemType.MEMORY_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "searching", "completed", "incomplete", "failed"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the memory search tool call. One of ``in_progress``, + ``searching``, ``completed``, ``incomplete`` or ``failed``,. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"searching\"], Literal[\"completed\"], + Literal[\"incomplete\"], Literal[\"failed\"]""" + results: Optional[list["_models.MemorySearchItem"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The results returned from the memory search.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "searching", "completed", "incomplete", "failed"], + created_by: Optional["_models.CreatedBy"] = None, + results: Optional[list["_models.MemorySearchItem"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MEMORY_SEARCH_CALL # type: ignore + + +class MemoryStoreDefinition(_Model): + """Base definition for memory store configurations. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + MemoryStoreDefaultDefinition + + :ivar kind: The kind of the memory store. Required. "default" + :vartype kind: str or ~azure.ai.projects.models.MemoryStoreKind + """ + + __mapping__: dict[str, _Model] = {} + kind: str = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) + """The kind of the memory store. Required. \"default\"""" + + @overload + def __init__( + self, + *, + kind: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreDefaultDefinition(MemoryStoreDefinition, discriminator="default"): + """Default memory store implementation. + + :ivar kind: The kind of the memory store. Required. The default memory store implementation. + :vartype kind: str or ~azure.ai.projects.models.DEFAULT + :ivar chat_model: The name or identifier of the chat completion model deployment used for + memory processing. Required. + :vartype chat_model: str + :ivar embedding_model: The name or identifier of the embedding model deployment used for memory + processing. Required. + :vartype embedding_model: str + :ivar options: Default memory store options. + :vartype options: ~azure.ai.projects.models.MemoryStoreDefaultOptions + """ + + kind: Literal[MemoryStoreKind.DEFAULT] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The kind of the memory store. Required. The default memory store implementation.""" + chat_model: str = rest_field(visibility=["read", "create"]) + """The name or identifier of the chat completion model deployment used for memory processing. + Required.""" + embedding_model: str = rest_field(visibility=["read", "create"]) + """The name or identifier of the embedding model deployment used for memory processing. Required.""" + options: Optional["_models.MemoryStoreDefaultOptions"] = rest_field(visibility=["read", "create"]) + """Default memory store options.""" + + @overload + def __init__( + self, + *, + chat_model: str, + embedding_model: str, + options: Optional["_models.MemoryStoreDefaultOptions"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = MemoryStoreKind.DEFAULT # type: ignore + + +class MemoryStoreDefaultOptions(_Model): + """Default memory store configurations. + + :ivar user_profile_enabled: Whether to enable user profile extraction and storage. Default is + true. Required. + :vartype user_profile_enabled: bool + :ivar user_profile_details: Specific categories or types of user profile information to extract + and store. + :vartype user_profile_details: str + :ivar chat_summary_enabled: Whether to enable chat summary extraction and storage. Default is + true. Required. + :vartype chat_summary_enabled: bool + """ + + user_profile_enabled: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to enable user profile extraction and storage. Default is true. Required.""" + user_profile_details: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Specific categories or types of user profile information to extract and store.""" + chat_summary_enabled: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to enable chat summary extraction and storage. Default is true. Required.""" + + @overload + def __init__( + self, + *, + user_profile_enabled: bool, + chat_summary_enabled: bool, + user_profile_details: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreDeleteScopeResponse(_Model): + """Response for deleting memories from a scope. + + :ivar object: The object type. Always 'memory_store.scope.deleted'. Required. Default value is + "memory_store.scope.deleted". + :vartype object: str + :ivar name: The name of the memory store. Required. + :vartype name: str + :ivar scope: The scope from which memories were deleted. Required. + :vartype scope: str + :ivar deleted: Whether the deletion operation was successful. Required. + :vartype deleted: bool + """ + + object: Literal["memory_store.scope.deleted"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The object type. Always 'memory_store.scope.deleted'. Required. Default value is + \"memory_store.scope.deleted\".""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the memory store. Required.""" + scope: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The scope from which memories were deleted. Required.""" + deleted: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the deletion operation was successful. Required.""" + + @overload + def __init__( + self, + *, + name: str, + scope: str, + deleted: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["memory_store.scope.deleted"] = "memory_store.scope.deleted" + + +class MemoryStoreObject(_Model): + """A memory store that can store and retrieve user memories. + + :ivar object: The object type, which is always 'memory_store'. Required. Default value is + "memory_store". + :vartype object: str + :ivar id: The unique identifier of the memory store. Required. + :vartype id: str + :ivar created_at: The Unix timestamp (seconds) when the memory store was created. Required. + :vartype created_at: ~datetime.datetime + :ivar updated_at: The Unix timestamp (seconds) when the memory store was last updated. + Required. + :vartype updated_at: ~datetime.datetime + :ivar name: The name of the memory store. Required. + :vartype name: str + :ivar description: A human-readable description of the memory store. + :vartype description: str + :ivar metadata: Arbitrary key-value metadata to associate with the memory store. + :vartype metadata: dict[str, str] + :ivar definition: The definition of the memory store. Required. + :vartype definition: ~azure.ai.projects.models.MemoryStoreDefinition + """ + + object: Literal["memory_store"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type, which is always 'memory_store'. Required. Default value is \"memory_store\".""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the memory store. Required.""" + created_at: datetime.datetime = rest_field( + visibility=["read", "create", "update", "delete", "query"], format="unix-timestamp" + ) + """The Unix timestamp (seconds) when the memory store was created. Required.""" + updated_at: datetime.datetime = rest_field( + visibility=["read", "create", "update", "delete", "query"], format="unix-timestamp" + ) + """The Unix timestamp (seconds) when the memory store was last updated. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the memory store. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A human-readable description of the memory store.""" + metadata: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Arbitrary key-value metadata to associate with the memory store.""" + definition: "_models.MemoryStoreDefinition" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The definition of the memory store. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + created_at: datetime.datetime, + updated_at: datetime.datetime, + name: str, + definition: "_models.MemoryStoreDefinition", + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["memory_store"] = "memory_store" + + +class MemoryStoreOperationUsage(_Model): + """Usage statistics of a memory store operation. + + :ivar embedding_tokens: The number of embedding tokens. Required. + :vartype embedding_tokens: int + :ivar input_tokens: The number of input tokens. Required. + :vartype input_tokens: int + :ivar input_tokens_details: A detailed breakdown of the input tokens. Required. + :vartype input_tokens_details: + ~azure.ai.projects.models.MemoryStoreOperationUsageInputTokensDetails + :ivar output_tokens: The number of output tokens. Required. + :vartype output_tokens: int + :ivar output_tokens_details: A detailed breakdown of the output tokens. Required. + :vartype output_tokens_details: + ~azure.ai.projects.models.MemoryStoreOperationUsageOutputTokensDetails + :ivar total_tokens: The total number of tokens used. Required. + :vartype total_tokens: int + """ + + embedding_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of embedding tokens. Required.""" + input_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of input tokens. Required.""" + input_tokens_details: "_models.MemoryStoreOperationUsageInputTokensDetails" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A detailed breakdown of the input tokens. Required.""" + output_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of output tokens. Required.""" + output_tokens_details: "_models.MemoryStoreOperationUsageOutputTokensDetails" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A detailed breakdown of the output tokens. Required.""" + total_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The total number of tokens used. Required.""" + + @overload + def __init__( + self, + *, + embedding_tokens: int, + input_tokens: int, + input_tokens_details: "_models.MemoryStoreOperationUsageInputTokensDetails", + output_tokens: int, + output_tokens_details: "_models.MemoryStoreOperationUsageOutputTokensDetails", + total_tokens: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreOperationUsageInputTokensDetails(_Model): # pylint: disable=name-too-long + """MemoryStoreOperationUsageInputTokensDetails. + + :ivar cached_tokens: The number of tokens that were retrieved from the cache. + `More on prompt caching `_. Required. + :vartype cached_tokens: int + """ + + cached_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of tokens that were retrieved from the cache. + `More on prompt caching `_. Required.""" + + @overload + def __init__( + self, + *, + cached_tokens: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreOperationUsageOutputTokensDetails(_Model): # pylint: disable=name-too-long + """MemoryStoreOperationUsageOutputTokensDetails. + + :ivar reasoning_tokens: The number of reasoning tokens. Required. + :vartype reasoning_tokens: int + """ + + reasoning_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of reasoning tokens. Required.""" + + @overload + def __init__( + self, + *, + reasoning_tokens: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreSearchResponse(_Model): + """Memory search response. + + :ivar search_id: The unique ID of this search request. Use this value as previous_search_id in + subsequent requests to perform incremental searches. Required. + :vartype search_id: str + :ivar memories: Related memory items found during the search operation. Required. + :vartype memories: list[~azure.ai.projects.models.MemorySearchItem] + :ivar usage: Usage statistics associated with the memory search operation. Required. + :vartype usage: ~azure.ai.projects.models.MemoryStoreOperationUsage + """ + + search_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of this search request. Use this value as previous_search_id in subsequent + requests to perform incremental searches. Required.""" + memories: list["_models.MemorySearchItem"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Related memory items found during the search operation. Required.""" + usage: "_models.MemoryStoreOperationUsage" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Usage statistics associated with the memory search operation. Required.""" + + @overload + def __init__( + self, + *, + search_id: str, + memories: list["_models.MemorySearchItem"], + usage: "_models.MemoryStoreOperationUsage", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreUpdateResponse(_Model): + """Provides the status of a memory store update operation. + + :ivar update_id: The unique ID of this update request. Use this value as previous_update_id in + subsequent requests to perform incremental updates. Required. + :vartype update_id: str + :ivar status: The status of the memory update operation. One of "queued", "in_progress", + "completed", "failed", or "superseded". Required. Known values are: "queued", "in_progress", + "completed", "failed", and "superseded". + :vartype status: str or ~azure.ai.projects.models.MemoryStoreUpdateStatus + :ivar superseded_by: The update_id the operation was superseded by when status is "superseded". + :vartype superseded_by: str + :ivar result: The result of memory store update operation when status is "completed". + :vartype result: ~azure.ai.projects.models.MemoryStoreUpdateResult + :ivar error: Error object that describes the error when status is "failed". + :vartype error: ~azure.ai.projects.models.ApiError + """ + + update_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of this update request. Use this value as previous_update_id in subsequent + requests to perform incremental updates. Required.""" + status: Union[str, "_models.MemoryStoreUpdateStatus"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the memory update operation. One of \"queued\", \"in_progress\", \"completed\", + \"failed\", or \"superseded\". Required. Known values are: \"queued\", \"in_progress\", + \"completed\", \"failed\", and \"superseded\".""" + superseded_by: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The update_id the operation was superseded by when status is \"superseded\".""" + result: Optional["_models.MemoryStoreUpdateResult"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The result of memory store update operation when status is \"completed\".""" + error: Optional["_models.ApiError"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Error object that describes the error when status is \"failed\".""" + + @overload + def __init__( + self, + *, + update_id: str, + status: Union[str, "_models.MemoryStoreUpdateStatus"], + superseded_by: Optional[str] = None, + result: Optional["_models.MemoryStoreUpdateResult"] = None, + error: Optional["_models.ApiError"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MemoryStoreUpdateResult(_Model): + """Memory update result. + + :ivar memory_operations: A list of individual memory operations that were performed during the + update. Required. + :vartype memory_operations: list[~azure.ai.projects.models.MemoryOperation] + :ivar usage: Usage statistics associated with the memory update operation. Required. + :vartype usage: ~azure.ai.projects.models.MemoryStoreOperationUsage + """ + + memory_operations: list["_models.MemoryOperation"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A list of individual memory operations that were performed during the update. Required.""" + usage: "_models.MemoryStoreOperationUsage" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Usage statistics associated with the memory update operation. Required.""" + + @overload + def __init__( + self, + *, + memory_operations: list["_models.MemoryOperation"], + usage: "_models.MemoryStoreOperationUsage", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MicrosoftFabricAgentTool(Tool, discriminator="fabric_dataagent_preview"): + """The input definition information for a Microsoft Fabric tool as used to configure an agent. + + :ivar type: The object type, which is always 'fabric_dataagent'. Required. + :vartype type: str or ~azure.ai.projects.models.FABRIC_DATAAGENT_PREVIEW + :ivar fabric_dataagent_preview: The fabric data agent tool parameters. Required. + :vartype fabric_dataagent_preview: ~azure.ai.projects.models.FabricDataAgentToolParameters + """ + + type: Literal[ToolType.FABRIC_DATAAGENT_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'fabric_dataagent'. Required.""" + fabric_dataagent_preview: "_models.FabricDataAgentToolParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The fabric data agent tool parameters. Required.""" + + @overload + def __init__( + self, + *, + fabric_dataagent_preview: "_models.FabricDataAgentToolParameters", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.FABRIC_DATAAGENT_PREVIEW # type: ignore + + +class ModelDeployment(Deployment, discriminator="ModelDeployment"): + """Model Deployment Definition. + + :ivar name: Name of the deployment. Required. + :vartype name: str + :ivar type: The type of the deployment. Required. Model deployment + :vartype type: str or ~azure.ai.projects.models.MODEL_DEPLOYMENT + :ivar model_name: Publisher-specific name of the deployed model. Required. + :vartype model_name: str + :ivar model_version: Publisher-specific version of the deployed model. Required. + :vartype model_version: str + :ivar model_publisher: Name of the deployed model's publisher. Required. + :vartype model_publisher: str + :ivar capabilities: Capabilities of deployed model. Required. + :vartype capabilities: dict[str, str] + :ivar sku: Sku of the model deployment. Required. + :vartype sku: ~azure.ai.projects.models.ModelDeploymentSku + :ivar connection_name: Name of the connection the deployment comes from. + :vartype connection_name: str + """ + + type: Literal[DeploymentType.MODEL_DEPLOYMENT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the deployment. Required. Model deployment""" + model_name: str = rest_field(name="modelName", visibility=["read"]) + """Publisher-specific name of the deployed model. Required.""" + model_version: str = rest_field(name="modelVersion", visibility=["read"]) + """Publisher-specific version of the deployed model. Required.""" + model_publisher: str = rest_field(name="modelPublisher", visibility=["read"]) + """Name of the deployed model's publisher. Required.""" + capabilities: dict[str, str] = rest_field(visibility=["read"]) + """Capabilities of deployed model. Required.""" + sku: "_models.ModelDeploymentSku" = rest_field(visibility=["read"]) + """Sku of the model deployment. Required.""" + connection_name: Optional[str] = rest_field(name="connectionName", visibility=["read"]) + """Name of the connection the deployment comes from.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = DeploymentType.MODEL_DEPLOYMENT # type: ignore + + +class ModelDeploymentSku(_Model): + """Sku information. + + :ivar capacity: Sku capacity. Required. + :vartype capacity: int + :ivar family: Sku family. Required. + :vartype family: str + :ivar name: Sku name. Required. + :vartype name: str + :ivar size: Sku size. Required. + :vartype size: str + :ivar tier: Sku tier. Required. + :vartype tier: str + """ + + capacity: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku capacity. Required.""" + family: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku family. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku name. Required.""" + size: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku size. Required.""" + tier: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku tier. Required.""" + + @overload + def __init__( + self, + *, + capacity: int, + family: str, + name: str, + size: str, + tier: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MonthlyRecurrenceSchedule(RecurrenceSchedule, discriminator="Monthly"): + """Monthly recurrence schedule. + + :ivar type: Monthly recurrence type. Required. Monthly recurrence pattern. + :vartype type: str or ~azure.ai.projects.models.MONTHLY + :ivar days_of_month: Days of the month for the recurrence schedule. Required. + :vartype days_of_month: list[int] + """ + + type: Literal[RecurrenceType.MONTHLY] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Monthly recurrence type. Required. Monthly recurrence pattern.""" + days_of_month: list[int] = rest_field( + name="daysOfMonth", visibility=["read", "create", "update", "delete", "query"] + ) + """Days of the month for the recurrence schedule. Required.""" + + @overload + def __init__( + self, + *, + days_of_month: list[int], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = RecurrenceType.MONTHLY # type: ignore + + +class NoAuthenticationCredentials(BaseCredentials, discriminator="None"): + """Credentials that do not require authentication. + + :ivar type: The credential type. Required. No credential + :vartype type: str or ~azure.ai.projects.models.NONE + """ + + type: Literal[CredentialType.NONE] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. No credential""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = CredentialType.NONE # type: ignore + + +class OAuthConsentRequestItemResource(ItemResource, discriminator="oauth_consent_request"): + """Request from the service for the user to perform OAuth consent. + + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar id: Required. + :vartype id: str + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.OAUTH_CONSENT_REQUEST + :ivar consent_link: The link the user can use to perform OAuth consent. Required. + :vartype consent_link: str + :ivar server_label: The server label for the OAuth consent request. Required. + :vartype server_label: str + """ + + type: Literal[ItemType.OAUTH_CONSENT_REQUEST] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + consent_link: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The link the user can use to perform OAuth consent. Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The server label for the OAuth consent request. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + consent_link: str, + server_label: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.OAUTH_CONSENT_REQUEST # type: ignore + + +class OneTimeTrigger(Trigger, discriminator="OneTime"): + """One-time trigger. + + :ivar type: Required. One-time trigger. + :vartype type: str or ~azure.ai.projects.models.ONE_TIME + :ivar trigger_at: Date and time for the one-time trigger in ISO 8601 format. Required. + :vartype trigger_at: str + :ivar time_zone: Time zone for the one-time trigger. + :vartype time_zone: str + """ + + type: Literal[TriggerType.ONE_TIME] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. One-time trigger.""" + trigger_at: str = rest_field(name="triggerAt", visibility=["read", "create", "update", "delete", "query"]) + """Date and time for the one-time trigger in ISO 8601 format. Required.""" + time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"]) + """Time zone for the one-time trigger.""" + + @overload + def __init__( + self, + *, + trigger_at: str, + time_zone: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = TriggerType.ONE_TIME # type: ignore + + +class OpenApiAgentTool(Tool, discriminator="openapi"): + """The input definition information for an OpenAPI tool as used to configure an agent. + + :ivar type: The object type, which is always 'openapi'. Required. + :vartype type: str or ~azure.ai.projects.models.OPENAPI + :ivar openapi: The openapi function definition. Required. + :vartype openapi: ~azure.ai.projects.models.OpenApiFunctionDefinition + """ + + type: Literal[ToolType.OPENAPI] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'openapi'. Required.""" + openapi: "_models.OpenApiFunctionDefinition" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The openapi function definition. Required.""" + + @overload + def __init__( + self, + *, + openapi: "_models.OpenApiFunctionDefinition", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ToolType.OPENAPI # type: ignore + + +class OpenApiAuthDetails(_Model): + """authentication details for OpenApiFunctionDefinition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + OpenApiAnonymousAuthDetails, OpenApiManagedAuthDetails, OpenApiProjectConnectionAuthDetails + + :ivar type: The type of authentication, must be anonymous/project_connection/managed_identity. + Required. Known values are: "anonymous", "project_connection", and "managed_identity". + :vartype type: str or ~azure.ai.projects.models.OpenApiAuthType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of authentication, must be anonymous/project_connection/managed_identity. Required. + Known values are: \"anonymous\", \"project_connection\", and \"managed_identity\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class OpenApiAnonymousAuthDetails(OpenApiAuthDetails, discriminator="anonymous"): + """Security details for OpenApi anonymous authentication. + + :ivar type: The object type, which is always 'anonymous'. Required. + :vartype type: str or ~azure.ai.projects.models.ANONYMOUS + """ + + type: Literal[OpenApiAuthType.ANONYMOUS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'anonymous'. Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = OpenApiAuthType.ANONYMOUS # type: ignore + + +class OpenApiFunctionDefinition(_Model): + """The input definition information for an openapi function. + + :ivar name: The name of the function to be called. Required. + :vartype name: str + :ivar description: A description of what the function does, used by the model to choose when + and how to call the function. + :vartype description: str + :ivar spec: The openapi function shape, described as a JSON Schema object. Required. + :vartype spec: any + :ivar auth: Open API authentication details. Required. + :vartype auth: ~azure.ai.projects.models.OpenApiAuthDetails + :ivar default_params: List of OpenAPI spec parameters that will use user-provided defaults. + :vartype default_params: list[str] + :ivar functions: List of function definitions used by OpenApi tool. + :vartype functions: list[~azure.ai.projects.models.OpenApiFunctionDefinitionFunction] + """ + + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to be called. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of what the function does, used by the model to choose when and how to call the + function.""" + spec: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The openapi function shape, described as a JSON Schema object. Required.""" + auth: "_models.OpenApiAuthDetails" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Open API authentication details. Required.""" + default_params: Optional[list[str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of OpenAPI spec parameters that will use user-provided defaults.""" + functions: Optional[list["_models.OpenApiFunctionDefinitionFunction"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """List of function definitions used by OpenApi tool.""" + + @overload + def __init__( + self, + *, + name: str, + spec: Any, + auth: "_models.OpenApiAuthDetails", + description: Optional[str] = None, + default_params: Optional[list[str]] = None, + functions: Optional[list["_models.OpenApiFunctionDefinitionFunction"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class OpenApiFunctionDefinitionFunction(_Model): + """OpenApiFunctionDefinitionFunction. + + :ivar name: The name of the function to be called. Required. + :vartype name: str + :ivar description: A description of what the function does, used by the model to choose when + and how to call the function. + :vartype description: str + :ivar parameters: The parameters the functions accepts, described as a JSON Schema object. + Required. + :vartype parameters: any + """ + + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to be called. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of what the function does, used by the model to choose when and how to call the + function.""" + parameters: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The parameters the functions accepts, described as a JSON Schema object. Required.""" + + @overload + def __init__( + self, + *, + name: str, + parameters: Any, + description: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class OpenApiManagedAuthDetails(OpenApiAuthDetails, discriminator="managed_identity"): + """Security details for OpenApi managed_identity authentication. + + :ivar type: The object type, which is always 'managed_identity'. Required. + :vartype type: str or ~azure.ai.projects.models.MANAGED_IDENTITY + :ivar security_scheme: Connection auth security details. Required. + :vartype security_scheme: ~azure.ai.projects.models.OpenApiManagedSecurityScheme + """ + + type: Literal[OpenApiAuthType.MANAGED_IDENTITY] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'managed_identity'. Required.""" + security_scheme: "_models.OpenApiManagedSecurityScheme" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Connection auth security details. Required.""" + + @overload + def __init__( + self, + *, + security_scheme: "_models.OpenApiManagedSecurityScheme", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = OpenApiAuthType.MANAGED_IDENTITY # type: ignore + + +class OpenApiManagedSecurityScheme(_Model): + """Security scheme for OpenApi managed_identity authentication. + + :ivar audience: Authentication scope for managed_identity auth type. Required. + :vartype audience: str + """ + + audience: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Authentication scope for managed_identity auth type. Required.""" + + @overload + def __init__( + self, + *, + audience: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class OpenApiProjectConnectionAuthDetails(OpenApiAuthDetails, discriminator="project_connection"): + """Security details for OpenApi project connection authentication. + + :ivar type: The object type, which is always 'project_connection'. Required. + :vartype type: str or ~azure.ai.projects.models.PROJECT_CONNECTION + :ivar security_scheme: Project connection auth security details. Required. + :vartype security_scheme: ~azure.ai.projects.models.OpenApiProjectConnectionSecurityScheme + """ + + type: Literal[OpenApiAuthType.PROJECT_CONNECTION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'project_connection'. Required.""" + security_scheme: "_models.OpenApiProjectConnectionSecurityScheme" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Project connection auth security details. Required.""" + + @overload + def __init__( + self, + *, + security_scheme: "_models.OpenApiProjectConnectionSecurityScheme", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = OpenApiAuthType.PROJECT_CONNECTION # type: ignore + + +class OpenApiProjectConnectionSecurityScheme(_Model): + """Security scheme for OpenApi managed_identity authentication. + + :ivar project_connection_id: Project connection id for Project Connection auth type. Required. + :vartype project_connection_id: str + """ + + project_connection_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Project connection id for Project Connection auth type. Required.""" + + @overload + def __init__( + self, + *, + project_connection_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PagedScheduleRun(_Model): + """Paged collection of ScheduleRun items. + + :ivar value: The ScheduleRun items on this page. Required. + :vartype value: list[~azure.ai.projects.models.ScheduleRun] + :ivar next_link: The link to the next page of items. + :vartype next_link: str + """ + + value: list["_models.ScheduleRun"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ScheduleRun items on this page. Required.""" + next_link: Optional[str] = rest_field(name="nextLink", visibility=["read", "create", "update", "delete", "query"]) + """The link to the next page of items.""" + + @overload + def __init__( + self, + *, + value: list["_models.ScheduleRun"], + next_link: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PendingUploadRequest(_Model): + """Represents a request for a pending upload. + + :ivar pending_upload_id: If PendingUploadId is not provided, a random GUID will be used. + :vartype pending_upload_id: str + :ivar connection_name: Azure Storage Account connection name to use for generating temporary + SAS token. + :vartype connection_name: str + :ivar pending_upload_type: BlobReference is the only supported type. Required. Blob Reference + is the only supported type. + :vartype pending_upload_type: str or ~azure.ai.projects.models.BLOB_REFERENCE + """ + + pending_upload_id: Optional[str] = rest_field( + name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] + ) + """If PendingUploadId is not provided, a random GUID will be used.""" + connection_name: Optional[str] = rest_field( + name="connectionName", visibility=["read", "create", "update", "delete", "query"] + ) + """Azure Storage Account connection name to use for generating temporary SAS token.""" + pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE] = rest_field( + name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] + ) + """BlobReference is the only supported type. Required. Blob Reference is the only supported type.""" + + @overload + def __init__( + self, + *, + pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE], + pending_upload_id: Optional[str] = None, + connection_name: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PendingUploadResponse(_Model): + """Represents the response for a pending upload request. + + :ivar blob_reference: Container-level read, write, list SAS. Required. + :vartype blob_reference: ~azure.ai.projects.models.BlobReference + :ivar pending_upload_id: ID for this upload request. Required. + :vartype pending_upload_id: str + :ivar version: Version of asset to be created if user did not specify version when initially + creating upload. + :vartype version: str + :ivar pending_upload_type: BlobReference is the only supported type. Required. Blob Reference + is the only supported type. + :vartype pending_upload_type: str or ~azure.ai.projects.models.BLOB_REFERENCE + """ + + blob_reference: "_models.BlobReference" = rest_field( + name="blobReference", visibility=["read", "create", "update", "delete", "query"] + ) + """Container-level read, write, list SAS. Required.""" + pending_upload_id: str = rest_field( + name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] + ) + """ID for this upload request. Required.""" + version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Version of asset to be created if user did not specify version when initially creating upload.""" + pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE] = rest_field( + name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] + ) + """BlobReference is the only supported type. Required. Blob Reference is the only supported type.""" + + @overload + def __init__( + self, + *, + blob_reference: "_models.BlobReference", + pending_upload_id: str, + pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE], + version: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Prompt(_Model): + """Reference to a prompt template and its variables. + `Learn more `_. + + :ivar id: The unique identifier of the prompt template to use. Required. + :vartype id: str + :ivar version: Optional version of the prompt template. + :vartype version: str + :ivar variables: + :vartype variables: ~azure.ai.projects.models.ResponsePromptVariables + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the prompt template to use. Required.""" + version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Optional version of the prompt template.""" + variables: Optional["_models.ResponsePromptVariables"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + version: Optional[str] = None, + variables: Optional["_models.ResponsePromptVariables"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PromptAgentDefinition(AgentDefinition, discriminator="prompt"): + """The prompt agent definition. + + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig + :ivar kind: Required. + :vartype kind: str or ~azure.ai.projects.models.PROMPT + :ivar model: The model deployment to use for this agent. Required. + :vartype model: str + :ivar instructions: A system (or developer) message inserted into the model's context. + :vartype instructions: str + :ivar temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 + will make the output more random, while lower values like 0.2 will make it more focused and + deterministic. + We generally recommend altering this or ``top_p`` but not both. + :vartype temperature: float + :ivar top_p: An alternative to sampling with temperature, called nucleus sampling, + where the model considers the results of the tokens with top_p probability + mass. So 0.1 means only the tokens comprising the top 10% probability mass + are considered. + + We generally recommend altering this or ``temperature`` but not both. + :vartype top_p: float + :ivar reasoning: + :vartype reasoning: ~azure.ai.projects.models.Reasoning + :ivar tools: An array of tools the model may call while generating a response. You + can specify which tool to use by setting the ``tool_choice`` parameter. + :vartype tools: list[~azure.ai.projects.models.Tool] + :ivar text: Configuration options for a text response from the model. Can be plain text or + structured JSON data. + :vartype text: ~azure.ai.projects.models.PromptAgentDefinitionText + :ivar structured_inputs: Set of structured inputs that can participate in prompt template + substitution or tool argument bindings. + :vartype structured_inputs: dict[str, ~azure.ai.projects.models.StructuredInputDefinition] + """ + + kind: Literal[AgentKind.PROMPT] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + model: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The model deployment to use for this agent. Required.""" + instructions: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A system (or developer) message inserted into the model's context.""" + temperature: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output + more random, while lower values like 0.2 will make it more focused and deterministic. + We generally recommend altering this or ``top_p`` but not both.""" + top_p: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An alternative to sampling with temperature, called nucleus sampling, + where the model considers the results of the tokens with top_p probability + mass. So 0.1 means only the tokens comprising the top 10% probability mass + are considered. + + We generally recommend altering this or ``temperature`` but not both.""" + reasoning: Optional["_models.Reasoning"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + tools: Optional[list["_models.Tool"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An array of tools the model may call while generating a response. You + can specify which tool to use by setting the ``tool_choice`` parameter.""" + text: Optional["_models.PromptAgentDefinitionText"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Configuration options for a text response from the model. Can be plain text or structured JSON + data.""" + structured_inputs: Optional[dict[str, "_models.StructuredInputDefinition"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Set of structured inputs that can participate in prompt template substitution or tool argument + bindings.""" + + @overload + def __init__( + self, + *, + model: str, + rai_config: Optional["_models.RaiConfig"] = None, + instructions: Optional[str] = None, + temperature: Optional[float] = None, + top_p: Optional[float] = None, + reasoning: Optional["_models.Reasoning"] = None, + tools: Optional[list["_models.Tool"]] = None, + text: Optional["_models.PromptAgentDefinitionText"] = None, + structured_inputs: Optional[dict[str, "_models.StructuredInputDefinition"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.kind = AgentKind.PROMPT # type: ignore + + +class PromptAgentDefinitionText(_Model): + """PromptAgentDefinitionText. + + :ivar format: + :vartype format: ~azure.ai.projects.models.ResponseTextFormatConfiguration + """ + + format: Optional["_models.ResponseTextFormatConfiguration"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + + @overload + def __init__( + self, + *, + format: Optional["_models.ResponseTextFormatConfiguration"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PromptBasedEvaluatorDefinition(EvaluatorDefinition, discriminator="prompt"): + """Prompt-based evaluator. + + :ivar init_parameters: The JSON schema (Draft 2020-12) for the evaluator's input parameters. + This includes parameters like type, properties, required. + :vartype init_parameters: any + :ivar data_schema: The JSON schema (Draft 2020-12) for the evaluator's input data. This + includes parameters like type, properties, required. + :vartype data_schema: any + :ivar metrics: List of output metrics produced by this evaluator. + :vartype metrics: dict[str, ~azure.ai.projects.models.EvaluatorMetric] + :ivar type: Required. Prompt-based definition + :vartype type: str or ~azure.ai.projects.models.PROMPT + :ivar prompt_text: The prompt text used for evaluation. Required. + :vartype prompt_text: str + """ + + type: Literal[EvaluatorDefinitionType.PROMPT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Prompt-based definition""" + prompt_text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The prompt text used for evaluation. Required.""" + + @overload + def __init__( + self, + *, + prompt_text: str, + init_parameters: Optional[Any] = None, + data_schema: Optional[Any] = None, + metrics: Optional[dict[str, "_models.EvaluatorMetric"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = EvaluatorDefinitionType.PROMPT # type: ignore + + +class ProtocolVersionRecord(_Model): + """A record mapping for a single protocol and its version. + + :ivar protocol: The protocol type. Required. Known values are: "activity_protocol" and + "responses". + :vartype protocol: str or ~azure.ai.projects.models.AgentProtocol + :ivar version: The version string for the protocol, e.g. 'v0.1.1'. Required. + :vartype version: str + """ + + protocol: Union[str, "_models.AgentProtocol"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The protocol type. Required. Known values are: \"activity_protocol\" and \"responses\".""" + version: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The version string for the protocol, e.g. 'v0.1.1'. Required.""" + + @overload + def __init__( + self, + *, + protocol: Union[str, "_models.AgentProtocol"], + version: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class RaiConfig(_Model): + """Configuration for Responsible AI (RAI) content filtering and safety features. + + :ivar rai_policy_name: The name of the RAI policy to apply. Required. + :vartype rai_policy_name: str + """ + + rai_policy_name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the RAI policy to apply. Required.""" + + @overload + def __init__( + self, + *, + rai_policy_name: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class RankingOptions(_Model): + """RankingOptions. + + :ivar ranker: The ranker to use for the file search. Is either a Literal["auto"] type or a + Literal["default-2024-11-15"] type. + :vartype ranker: str or str + :ivar score_threshold: The score threshold for the file search, a number between 0 and 1. + Numbers closer to 1 will attempt to return only the most relevant results, but may return fewer + results. + :vartype score_threshold: float + """ + + ranker: Optional[Literal["auto", "default-2024-11-15"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The ranker to use for the file search. Is either a Literal[\"auto\"] type or a + Literal[\"default-2024-11-15\"] type.""" + score_threshold: Optional[float] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The score threshold for the file search, a number between 0 and 1. Numbers closer to 1 will + attempt to return only the most relevant results, but may return fewer results.""" + + @overload + def __init__( + self, + *, + ranker: Optional[Literal["auto", "default-2024-11-15"]] = None, + score_threshold: Optional[float] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Reasoning(_Model): + """**o-series models only** + + Configuration options for `reasoning models + `_. + + :ivar effort: Known values are: "low", "medium", and "high". + :vartype effort: str or ~azure.ai.projects.models.ReasoningEffort + :ivar summary: A summary of the reasoning performed by the model. This can be + useful for debugging and understanding the model's reasoning process. + One of ``auto``, ``concise``, or ``detailed``. Is one of the following types: Literal["auto"], + Literal["concise"], Literal["detailed"] + :vartype summary: str or str or str + :ivar generate_summary: **Deprecated:** use ``summary`` instead. A summary of the reasoning + performed by the model. This can be useful for debugging and understanding the model's + reasoning process. One of ``auto``, ``concise``, or ``detailed``. Is one of the following + types: Literal["auto"], Literal["concise"], Literal["detailed"] + :vartype generate_summary: str or str or str + """ + + effort: Optional[Union[str, "_models.ReasoningEffort"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Known values are: \"low\", \"medium\", and \"high\".""" + summary: Optional[Literal["auto", "concise", "detailed"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A summary of the reasoning performed by the model. This can be + useful for debugging and understanding the model's reasoning process. + One of ``auto``, ``concise``, or ``detailed``. Is one of the following types: + Literal[\"auto\"], Literal[\"concise\"], Literal[\"detailed\"]""" + generate_summary: Optional[Literal["auto", "concise", "detailed"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """**Deprecated:** use ``summary`` instead. A summary of the reasoning performed by the model. + This can be useful for debugging and understanding the model's reasoning process. One of + ``auto``, ``concise``, or ``detailed``. Is one of the following types: Literal[\"auto\"], + Literal[\"concise\"], Literal[\"detailed\"]""" + + @overload + def __init__( + self, + *, + effort: Optional[Union[str, "_models.ReasoningEffort"]] = None, + summary: Optional[Literal["auto", "concise", "detailed"]] = None, + generate_summary: Optional[Literal["auto", "concise", "detailed"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ReasoningItemParam(ItemParam, discriminator="reasoning"): + """A description of the chain of thought used by a reasoning model while generating + a response. Be sure to include these items in your ``input`` to the Responses API + for subsequent turns of a conversation if you are manually + `managing context `_. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.REASONING + :ivar encrypted_content: The encrypted content of the reasoning item - populated when a + response is + generated with ``reasoning.encrypted_content`` in the ``include`` parameter. + :vartype encrypted_content: str + :ivar summary: Reasoning text contents. Required. + :vartype summary: list[~azure.ai.projects.models.ReasoningItemSummaryPart] + """ + + type: Literal[ItemType.REASONING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + encrypted_content: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The encrypted content of the reasoning item - populated when a response is + generated with ``reasoning.encrypted_content`` in the ``include`` parameter.""" + summary: list["_models.ReasoningItemSummaryPart"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Reasoning text contents. Required.""" + + @overload + def __init__( + self, + *, + summary: list["_models.ReasoningItemSummaryPart"], + encrypted_content: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.REASONING # type: ignore + + +class ReasoningItemResource(ItemResource, discriminator="reasoning"): + """A description of the chain of thought used by a reasoning model while generating + a response. Be sure to include these items in your ``input`` to the Responses API + for subsequent turns of a conversation if you are manually + `managing context `_. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.REASONING + :ivar encrypted_content: The encrypted content of the reasoning item - populated when a + response is + generated with ``reasoning.encrypted_content`` in the ``include`` parameter. + :vartype encrypted_content: str + :ivar summary: Reasoning text contents. Required. + :vartype summary: list[~azure.ai.projects.models.ReasoningItemSummaryPart] + """ + + type: Literal[ItemType.REASONING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + encrypted_content: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The encrypted content of the reasoning item - populated when a response is + generated with ``reasoning.encrypted_content`` in the ``include`` parameter.""" + summary: list["_models.ReasoningItemSummaryPart"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Reasoning text contents. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + summary: list["_models.ReasoningItemSummaryPart"], + created_by: Optional["_models.CreatedBy"] = None, + encrypted_content: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.REASONING # type: ignore + + +class ReasoningItemSummaryPart(_Model): + """ReasoningItemSummaryPart. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ReasoningItemSummaryTextPart + + :ivar type: Required. "summary_text" + :vartype type: str or ~azure.ai.projects.models.ReasoningItemSummaryPartType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. \"summary_text\"""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ReasoningItemSummaryTextPart(ReasoningItemSummaryPart, discriminator="summary_text"): + """ReasoningItemSummaryTextPart. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.SUMMARY_TEXT + :ivar text: Required. + :vartype text: str + """ + + type: Literal[ReasoningItemSummaryPartType.SUMMARY_TEXT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ReasoningItemSummaryPartType.SUMMARY_TEXT # type: ignore + + +class RecurrenceTrigger(Trigger, discriminator="Recurrence"): + """Recurrence based trigger. + + :ivar type: Type of the trigger. Required. Recurrence based trigger. + :vartype type: str or ~azure.ai.projects.models.RECURRENCE + :ivar start_time: Start time for the recurrence schedule in ISO 8601 format. + :vartype start_time: str + :ivar end_time: End time for the recurrence schedule in ISO 8601 format. + :vartype end_time: str + :ivar time_zone: Time zone for the recurrence schedule. + :vartype time_zone: str + :ivar interval: Interval for the recurrence schedule. Required. + :vartype interval: int + :ivar schedule: Recurrence schedule for the recurrence trigger. Required. + :vartype schedule: ~azure.ai.projects.models.RecurrenceSchedule + """ + + type: Literal[TriggerType.RECURRENCE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of the trigger. Required. Recurrence based trigger.""" + start_time: Optional[str] = rest_field(name="startTime", visibility=["read", "create", "update", "delete", "query"]) + """Start time for the recurrence schedule in ISO 8601 format.""" + end_time: Optional[str] = rest_field(name="endTime", visibility=["read", "create", "update", "delete", "query"]) + """End time for the recurrence schedule in ISO 8601 format.""" + time_zone: Optional[str] = rest_field(name="timeZone", visibility=["read", "create", "update", "delete", "query"]) + """Time zone for the recurrence schedule.""" + interval: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Interval for the recurrence schedule. Required.""" + schedule: "_models.RecurrenceSchedule" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Recurrence schedule for the recurrence trigger. Required.""" + + @overload + def __init__( + self, + *, + interval: int, + schedule: "_models.RecurrenceSchedule", + start_time: Optional[str] = None, + end_time: Optional[str] = None, + time_zone: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = TriggerType.RECURRENCE # type: ignore + + +class RedTeam(_Model): + """Red team details. + + :ivar name: Identifier of the red team run. Required. + :vartype name: str + :ivar display_name: Name of the red-team run. + :vartype display_name: str + :ivar num_turns: Number of simulation rounds. + :vartype num_turns: int + :ivar attack_strategies: List of attack strategies or nested lists of attack strategies. + :vartype attack_strategies: list[str or ~azure.ai.projects.models.AttackStrategy] + :ivar simulation_only: Simulation-only or Simulation + Evaluation. Default false, if true the + scan outputs conversation not evaluation result. + :vartype simulation_only: bool + :ivar risk_categories: List of risk categories to generate attack objectives for. + :vartype risk_categories: list[str or ~azure.ai.projects.models.RiskCategory] + :ivar application_scenario: Application scenario for the red team operation, to generate + scenario specific attacks. + :vartype application_scenario: str + :ivar tags: Red team's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Red team's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar status: Status of the red-team. It is set by service and is read-only. + :vartype status: str + :ivar target: Target configuration for the red-team run. Required. + :vartype target: ~azure.ai.projects.models.TargetConfig + """ + + name: str = rest_field(name="id", visibility=["read"]) + """Identifier of the red team run. Required.""" + display_name: Optional[str] = rest_field( + name="displayName", visibility=["read", "create", "update", "delete", "query"] + ) + """Name of the red-team run.""" + num_turns: Optional[int] = rest_field(name="numTurns", visibility=["read", "create", "update", "delete", "query"]) + """Number of simulation rounds.""" + attack_strategies: Optional[list[Union[str, "_models.AttackStrategy"]]] = rest_field( + name="attackStrategies", visibility=["read", "create", "update", "delete", "query"] + ) + """List of attack strategies or nested lists of attack strategies.""" + simulation_only: Optional[bool] = rest_field( + name="simulationOnly", visibility=["read", "create", "update", "delete", "query"] + ) + """Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs + conversation not evaluation result.""" + risk_categories: Optional[list[Union[str, "_models.RiskCategory"]]] = rest_field( + name="riskCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of risk categories to generate attack objectives for.""" + application_scenario: Optional[str] = rest_field( + name="applicationScenario", visibility=["read", "create", "update", "delete", "query"] + ) + """Application scenario for the red team operation, to generate scenario specific attacks.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + status: Optional[str] = rest_field(visibility=["read"]) + """Status of the red-team. It is set by service and is read-only.""" + target: "_models.TargetConfig" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Target configuration for the red-team run. Required.""" + + @overload + def __init__( + self, + *, + target: "_models.TargetConfig", + display_name: Optional[str] = None, + num_turns: Optional[int] = None, + attack_strategies: Optional[list[Union[str, "_models.AttackStrategy"]]] = None, + simulation_only: Optional[bool] = None, + risk_categories: Optional[list[Union[str, "_models.RiskCategory"]]] = None, + application_scenario: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + properties: Optional[dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Response(_Model): + """Response. + + :ivar metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Required. + :vartype metadata: dict[str, str] + :ivar temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 + will make the output more random, while lower values like 0.2 will make it more focused and + deterministic. + We generally recommend altering this or ``top_p`` but not both. Required. + :vartype temperature: float + :ivar top_p: An alternative to sampling with temperature, called nucleus sampling, + where the model considers the results of the tokens with top_p probability + mass. So 0.1 means only the tokens comprising the top 10% probability mass + are considered. + + We generally recommend altering this or ``temperature`` but not both. Required. + :vartype top_p: float + :ivar user: A unique identifier representing your end-user, which can help OpenAI to monitor + and detect abuse. `Learn more `_. Required. + :vartype user: str + :ivar service_tier: Note: service_tier is not applicable to Azure OpenAI. Known values are: + "auto", "default", "flex", "scale", and "priority". + :vartype service_tier: str or ~azure.ai.projects.models.ServiceTier + :ivar top_logprobs: An integer between 0 and 20 specifying the number of most likely tokens to + return at each token position, each with an associated log probability. + :vartype top_logprobs: int + :ivar previous_response_id: The unique ID of the previous response to the model. Use this to + create multi-turn conversations. Learn more about + `conversation state `_. + :vartype previous_response_id: str + :ivar model: The model deployment to use for the creation of this response. + :vartype model: str + :ivar reasoning: + :vartype reasoning: ~azure.ai.projects.models.Reasoning + :ivar background: Whether to run the model response in the background. + `Learn more `_. + :vartype background: bool + :ivar max_output_tokens: An upper bound for the number of tokens that can be generated for a + response, including visible output tokens and `reasoning tokens `_. + :vartype max_output_tokens: int + :ivar max_tool_calls: The maximum number of total calls to built-in tools that can be processed + in a response. This maximum number applies across all built-in tool calls, not per individual + tool. Any further attempts to call a tool by the model will be ignored. + :vartype max_tool_calls: int + :ivar text: Configuration options for a text response from the model. Can be plain + text or structured JSON data. See `Text inputs and outputs `_ + and `Structured Outputs `_. + :vartype text: ~azure.ai.projects.models.ResponseText + :ivar tools: An array of tools the model may call while generating a response. You + can specify which tool to use by setting the ``tool_choice`` parameter. + + The two categories of tools you can provide the model are: + + + + * **Built-in tools**: Tools that are provided by OpenAI that extend the + model's capabilities, like [web search](/docs/guides/tools-web-search) + or [file search](/docs/guides/tools-file-search). Learn more about + [built-in tools](/docs/guides/tools). + * **Function calls (custom tools)**: Functions that are defined by you, + enabling the model to call your own code. Learn more about + [function calling](/docs/guides/function-calling). + :vartype tools: list[~azure.ai.projects.models.Tool] + :ivar tool_choice: How the model should select which tool (or tools) to use when generating + a response. See the ``tools`` parameter to see how to specify which tools + the model can call. Is either a Union[str, "_models.ToolChoiceOptions"] type or a + ToolChoiceObject type. + :vartype tool_choice: str or ~azure.ai.projects.models.ToolChoiceOptions or + ~azure.ai.projects.models.ToolChoiceObject + :ivar prompt: + :vartype prompt: ~azure.ai.projects.models.Prompt + :ivar truncation: The truncation strategy to use for the model response. + + * `auto`: If the context of this response and previous ones exceeds + the model's context window size, the model will truncate the + response to fit the context window by dropping input items in the + middle of the conversation. + * `disabled` (default): If a model response will exceed the context window + size for a model, the request will fail with a 400 error. Is either a Literal["auto"] type or a + Literal["disabled"] type. + :vartype truncation: str or str + :ivar id: Unique identifier for this Response. Required. + :vartype id: str + :ivar object: The object type of this resource - always set to ``response``. Required. Default + value is "response". + :vartype object: str + :ivar status: The status of the response generation. One of ``completed``, ``failed``, + ``in_progress``, ``cancelled``, ``queued``, or ``incomplete``. Is one of the following types: + Literal["completed"], Literal["failed"], Literal["in_progress"], Literal["cancelled"], + Literal["queued"], Literal["incomplete"] + :vartype status: str or str or str or str or str or str + :ivar created_at: Unix timestamp (in seconds) of when this Response was created. Required. + :vartype created_at: ~datetime.datetime + :ivar error: Required. + :vartype error: ~azure.ai.projects.models.ResponseError + :ivar incomplete_details: Details about why the response is incomplete. Required. + :vartype incomplete_details: ~azure.ai.projects.models.ResponseIncompleteDetails1 + :ivar output: An array of content items generated by the model. + + + + * The length and order of items in the `output` array is dependent + on the model's response. + * Rather than accessing the first item in the `output` array and + assuming it's an `assistant` message with the content generated by + the model, you might consider using the `output_text` property where + supported in SDKs. Required. + :vartype output: list[~azure.ai.projects.models.ItemResource] + :ivar instructions: A system (or developer) message inserted into the model's context. + + When using along with ``previous_response_id``, the instructions from a previous + response will not be carried over to the next response. This makes it simple + to swap out system (or developer) messages in new responses. Required. Is either a str type or + a [ItemParam] type. + :vartype instructions: str or list[~azure.ai.projects.models.ItemParam] + :ivar output_text: SDK-only convenience property that contains the aggregated text output + from all ``output_text`` items in the ``output`` array, if any are present. + Supported in the Python and JavaScript SDKs. + :vartype output_text: str + :ivar usage: + :vartype usage: ~azure.ai.projects.models.ResponseUsage + :ivar parallel_tool_calls: Whether to allow the model to run tool calls in parallel. Required. + :vartype parallel_tool_calls: bool + :ivar conversation: Required. + :vartype conversation: ~azure.ai.projects.models.ResponseConversation1 + :ivar agent: The agent used for this response. + :vartype agent: ~azure.ai.projects.models.AgentId + :ivar structured_inputs: The structured inputs to the response that can participate in prompt + template substitution or tool argument bindings. + :vartype structured_inputs: dict[str, any] + """ + + metadata: dict[str, str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Required.""" + temperature: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output + more random, while lower values like 0.2 will make it more focused and deterministic. + We generally recommend altering this or ``top_p`` but not both. Required.""" + top_p: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An alternative to sampling with temperature, called nucleus sampling, + where the model considers the results of the tokens with top_p probability + mass. So 0.1 means only the tokens comprising the top 10% probability mass + are considered. + + We generally recommend altering this or ``temperature`` but not both. Required.""" + user: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A unique identifier representing your end-user, which can help OpenAI to monitor and detect + abuse. `Learn more `_. Required.""" + service_tier: Optional[Union[str, "_models.ServiceTier"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Note: service_tier is not applicable to Azure OpenAI. Known values are: \"auto\", \"default\", + \"flex\", \"scale\", and \"priority\".""" + top_logprobs: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An integer between 0 and 20 specifying the number of most likely tokens to return at each token + position, each with an associated log probability.""" + previous_response_id: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique ID of the previous response to the model. Use this to + create multi-turn conversations. Learn more about + `conversation state `_.""" + model: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The model deployment to use for the creation of this response.""" + reasoning: Optional["_models.Reasoning"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + background: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to run the model response in the background. + `Learn more `_.""" + max_output_tokens: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An upper bound for the number of tokens that can be generated for a response, including visible + output tokens and `reasoning tokens `_.""" + max_tool_calls: Optional[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The maximum number of total calls to built-in tools that can be processed in a response. This + maximum number applies across all built-in tool calls, not per individual tool. Any further + attempts to call a tool by the model will be ignored.""" + text: Optional["_models.ResponseText"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Configuration options for a text response from the model. Can be plain + text or structured JSON data. See `Text inputs and outputs `_ + and `Structured Outputs `_.""" + tools: Optional[list["_models.Tool"]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An array of tools the model may call while generating a response. You + can specify which tool to use by setting the ``tool_choice`` parameter. + + The two categories of tools you can provide the model are: + + + + * **Built-in tools**: Tools that are provided by OpenAI that extend the + model's capabilities, like [web search](/docs/guides/tools-web-search) + or [file search](/docs/guides/tools-file-search). Learn more about + [built-in tools](/docs/guides/tools). + * **Function calls (custom tools)**: Functions that are defined by you, + enabling the model to call your own code. Learn more about + [function calling](/docs/guides/function-calling).""" + tool_choice: Optional[Union[str, "_models.ToolChoiceOptions", "_models.ToolChoiceObject"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """How the model should select which tool (or tools) to use when generating + a response. See the ``tools`` parameter to see how to specify which tools + the model can call. Is either a Union[str, \"_models.ToolChoiceOptions\"] type or a + ToolChoiceObject type.""" + prompt: Optional["_models.Prompt"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + truncation: Optional[Literal["auto", "disabled"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The truncation strategy to use for the model response. + + * `auto`: If the context of this response and previous ones exceeds + the model's context window size, the model will truncate the + response to fit the context window by dropping input items in the + middle of the conversation. + * `disabled` (default): If a model response will exceed the context window + size for a model, the request will fail with a 400 error. Is either a Literal[\"auto\"] type or + a Literal[\"disabled\"] type.""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique identifier for this Response. Required.""" + object: Literal["response"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The object type of this resource - always set to ``response``. Required. Default value is + \"response\".""" + status: Optional[Literal["completed", "failed", "in_progress", "cancelled", "queued", "incomplete"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the response generation. One of ``completed``, ``failed``, + ``in_progress``, ``cancelled``, ``queued``, or ``incomplete``. Is one of the following types: + Literal[\"completed\"], Literal[\"failed\"], Literal[\"in_progress\"], Literal[\"cancelled\"], + Literal[\"queued\"], Literal[\"incomplete\"]""" + created_at: datetime.datetime = rest_field( + visibility=["read", "create", "update", "delete", "query"], format="unix-timestamp" + ) + """Unix timestamp (in seconds) of when this Response was created. Required.""" + error: "_models.ResponseError" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + incomplete_details: "_models.ResponseIncompleteDetails1" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Details about why the response is incomplete. Required.""" + output: list["_models.ItemResource"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An array of content items generated by the model. + + + + * The length and order of items in the `output` array is dependent + on the model's response. + * Rather than accessing the first item in the `output` array and + assuming it's an `assistant` message with the content generated by + the model, you might consider using the `output_text` property where + supported in SDKs. Required.""" + instructions: Union[str, list["_models.ItemParam"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A system (or developer) message inserted into the model's context. + + When using along with ``previous_response_id``, the instructions from a previous + response will not be carried over to the next response. This makes it simple + to swap out system (or developer) messages in new responses. Required. Is either a str type or + a [ItemParam] type.""" + output_text: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """SDK-only convenience property that contains the aggregated text output + from all ``output_text`` items in the ``output`` array, if any are present. + Supported in the Python and JavaScript SDKs.""" + usage: Optional["_models.ResponseUsage"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + parallel_tool_calls: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to allow the model to run tool calls in parallel. Required.""" + conversation: "_models.ResponseConversation1" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required.""" + agent: Optional["_models.AgentId"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The agent used for this response.""" + structured_inputs: Optional[dict[str, Any]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The structured inputs to the response that can participate in prompt template substitution or + tool argument bindings.""" + + @overload + def __init__( # pylint: disable=too-many-locals + self, + *, + metadata: dict[str, str], + temperature: float, + top_p: float, + user: str, + id: str, # pylint: disable=redefined-builtin + created_at: datetime.datetime, + error: "_models.ResponseError", + incomplete_details: "_models.ResponseIncompleteDetails1", + output: list["_models.ItemResource"], + instructions: Union[str, list["_models.ItemParam"]], + parallel_tool_calls: bool, + conversation: "_models.ResponseConversation1", + service_tier: Optional[Union[str, "_models.ServiceTier"]] = None, + top_logprobs: Optional[int] = None, + previous_response_id: Optional[str] = None, + model: Optional[str] = None, + reasoning: Optional["_models.Reasoning"] = None, + background: Optional[bool] = None, + max_output_tokens: Optional[int] = None, + max_tool_calls: Optional[int] = None, + text: Optional["_models.ResponseText"] = None, + tools: Optional[list["_models.Tool"]] = None, + tool_choice: Optional[Union[str, "_models.ToolChoiceOptions", "_models.ToolChoiceObject"]] = None, + prompt: Optional["_models.Prompt"] = None, + truncation: Optional[Literal["auto", "disabled"]] = None, + status: Optional[Literal["completed", "failed", "in_progress", "cancelled", "queued", "incomplete"]] = None, + output_text: Optional[str] = None, + usage: Optional["_models.ResponseUsage"] = None, + agent: Optional["_models.AgentId"] = None, + structured_inputs: Optional[dict[str, Any]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.object: Literal["response"] = "response" + + +class ResponseStreamEvent(_Model): + """ResponseStreamEvent. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ResponseErrorEvent, ResponseCodeInterpreterCallCompletedEvent, + ResponseCodeInterpreterCallInProgressEvent, ResponseCodeInterpreterCallInterpretingEvent, + ResponseCodeInterpreterCallCodeDeltaEvent, ResponseCodeInterpreterCallCodeDoneEvent, + ResponseCompletedEvent, ResponseContentPartAddedEvent, ResponseContentPartDoneEvent, + ResponseCreatedEvent, ResponseFailedEvent, ResponseFileSearchCallCompletedEvent, + ResponseFileSearchCallInProgressEvent, ResponseFileSearchCallSearchingEvent, + ResponseFunctionCallArgumentsDeltaEvent, ResponseFunctionCallArgumentsDoneEvent, + ResponseImageGenCallCompletedEvent, ResponseImageGenCallGeneratingEvent, + ResponseImageGenCallInProgressEvent, ResponseImageGenCallPartialImageEvent, + ResponseInProgressEvent, ResponseIncompleteEvent, ResponseMCPCallArgumentsDeltaEvent, + ResponseMCPCallArgumentsDoneEvent, ResponseMCPCallCompletedEvent, ResponseMCPCallFailedEvent, + ResponseMCPCallInProgressEvent, ResponseMCPListToolsCompletedEvent, + ResponseMCPListToolsFailedEvent, ResponseMCPListToolsInProgressEvent, + ResponseOutputItemAddedEvent, ResponseOutputItemDoneEvent, ResponseTextDeltaEvent, + ResponseTextDoneEvent, ResponseQueuedEvent, ResponseReasoningDeltaEvent, + ResponseReasoningDoneEvent, ResponseReasoningSummaryDeltaEvent, + ResponseReasoningSummaryDoneEvent, ResponseReasoningSummaryPartAddedEvent, + ResponseReasoningSummaryPartDoneEvent, ResponseReasoningSummaryTextDeltaEvent, + ResponseReasoningSummaryTextDoneEvent, ResponseRefusalDeltaEvent, ResponseRefusalDoneEvent, + ResponseWebSearchCallCompletedEvent, ResponseWebSearchCallInProgressEvent, + ResponseWebSearchCallSearchingEvent + + :ivar type: Required. Known values are: "response.audio.delta", "response.audio.done", + "response.audio_transcript.delta", "response.audio_transcript.done", + "response.code_interpreter_call_code.delta", "response.code_interpreter_call_code.done", + "response.code_interpreter_call.completed", "response.code_interpreter_call.in_progress", + "response.code_interpreter_call.interpreting", "response.completed", + "response.content_part.added", "response.content_part.done", "response.created", "error", + "response.file_search_call.completed", "response.file_search_call.in_progress", + "response.file_search_call.searching", "response.function_call_arguments.delta", + "response.function_call_arguments.done", "response.in_progress", "response.failed", + "response.incomplete", "response.output_item.added", "response.output_item.done", + "response.refusal.delta", "response.refusal.done", "response.output_text.annotation.added", + "response.output_text.delta", "response.output_text.done", + "response.reasoning_summary_part.added", "response.reasoning_summary_part.done", + "response.reasoning_summary_text.delta", "response.reasoning_summary_text.done", + "response.web_search_call.completed", "response.web_search_call.in_progress", + "response.web_search_call.searching", "response.image_generation_call.completed", + "response.image_generation_call.generating", "response.image_generation_call.in_progress", + "response.image_generation_call.partial_image", "response.mcp_call.arguments_delta", + "response.mcp_call.arguments_done", "response.mcp_call.completed", "response.mcp_call.failed", + "response.mcp_call.in_progress", "response.mcp_list_tools.completed", + "response.mcp_list_tools.failed", "response.mcp_list_tools.in_progress", "response.queued", + "response.reasoning.delta", "response.reasoning.done", "response.reasoning_summary.delta", and + "response.reasoning_summary.done". + :vartype type: str or ~azure.ai.projects.models.ResponseStreamEventType + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"response.audio.delta\", \"response.audio.done\", + \"response.audio_transcript.delta\", \"response.audio_transcript.done\", + \"response.code_interpreter_call_code.delta\", \"response.code_interpreter_call_code.done\", + \"response.code_interpreter_call.completed\", \"response.code_interpreter_call.in_progress\", + \"response.code_interpreter_call.interpreting\", \"response.completed\", + \"response.content_part.added\", \"response.content_part.done\", \"response.created\", + \"error\", \"response.file_search_call.completed\", \"response.file_search_call.in_progress\", + \"response.file_search_call.searching\", \"response.function_call_arguments.delta\", + \"response.function_call_arguments.done\", \"response.in_progress\", \"response.failed\", + \"response.incomplete\", \"response.output_item.added\", \"response.output_item.done\", + \"response.refusal.delta\", \"response.refusal.done\", + \"response.output_text.annotation.added\", \"response.output_text.delta\", + \"response.output_text.done\", \"response.reasoning_summary_part.added\", + \"response.reasoning_summary_part.done\", \"response.reasoning_summary_text.delta\", + \"response.reasoning_summary_text.done\", \"response.web_search_call.completed\", + \"response.web_search_call.in_progress\", \"response.web_search_call.searching\", + \"response.image_generation_call.completed\", \"response.image_generation_call.generating\", + \"response.image_generation_call.in_progress\", + \"response.image_generation_call.partial_image\", \"response.mcp_call.arguments_delta\", + \"response.mcp_call.arguments_done\", \"response.mcp_call.completed\", + \"response.mcp_call.failed\", \"response.mcp_call.in_progress\", + \"response.mcp_list_tools.completed\", \"response.mcp_list_tools.failed\", + \"response.mcp_list_tools.in_progress\", \"response.queued\", \"response.reasoning.delta\", + \"response.reasoning.done\", \"response.reasoning_summary.delta\", and + \"response.reasoning_summary.done\".""" + sequence_number: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The sequence number for this event. Required.""" + + @overload + def __init__( + self, + *, + type: str, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseCodeInterpreterCallCodeDeltaEvent( + ResponseStreamEvent, discriminator="response.code_interpreter_call_code.delta" +): # pylint: disable=name-too-long + """Emitted when a partial code snippet is streamed by the code interpreter. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.code_interpreter_call_code.delta``. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CODE_INTERPRETER_CALL_CODE_DELTA + :ivar output_index: The index of the output item in the response for which the code is being + streamed. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the code interpreter tool call item. Required. + :vartype item_id: str + :ivar delta: The partial code snippet being streamed by the code interpreter. Required. + :vartype delta: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_CODE_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.code_interpreter_call_code.delta``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response for which the code is being streamed. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the code interpreter tool call item. Required.""" + delta: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The partial code snippet being streamed by the code interpreter. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + delta: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_CODE_DELTA # type: ignore + + +class ResponseCodeInterpreterCallCodeDoneEvent( + ResponseStreamEvent, discriminator="response.code_interpreter_call_code.done" +): + """Emitted when the code snippet is finalized by the code interpreter. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.code_interpreter_call_code.done``. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CODE_INTERPRETER_CALL_CODE_DONE + :ivar output_index: The index of the output item in the response for which the code is + finalized. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the code interpreter tool call item. Required. + :vartype item_id: str + :ivar code: The final code snippet output by the code interpreter. Required. + :vartype code: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_CODE_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.code_interpreter_call_code.done``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response for which the code is finalized. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the code interpreter tool call item. Required.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The final code snippet output by the code interpreter. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + code: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_CODE_DONE # type: ignore + + +class ResponseCodeInterpreterCallCompletedEvent( + ResponseStreamEvent, discriminator="response.code_interpreter_call.completed" +): # pylint: disable=name-too-long + """Emitted when the code interpreter call is completed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.code_interpreter_call.completed``. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CODE_INTERPRETER_CALL_COMPLETED + :ivar output_index: The index of the output item in the response for which the code interpreter + call is completed. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the code interpreter tool call item. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.code_interpreter_call.completed``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response for which the code interpreter call is completed. + Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the code interpreter tool call item. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_COMPLETED # type: ignore + + +class ResponseCodeInterpreterCallInProgressEvent( + ResponseStreamEvent, discriminator="response.code_interpreter_call.in_progress" +): # pylint: disable=name-too-long + """Emitted when a code interpreter call is in progress. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.code_interpreter_call.in_progress``. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CODE_INTERPRETER_CALL_IN_PROGRESS + :ivar output_index: The index of the output item in the response for which the code interpreter + call is in progress. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the code interpreter tool call item. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.code_interpreter_call.in_progress``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response for which the code interpreter call is in + progress. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the code interpreter tool call item. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_IN_PROGRESS # type: ignore + + +class ResponseCodeInterpreterCallInterpretingEvent( + ResponseStreamEvent, discriminator="response.code_interpreter_call.interpreting" +): # pylint: disable=name-too-long + """Emitted when the code interpreter is actively interpreting the code snippet. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.code_interpreter_call.interpreting``. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CODE_INTERPRETER_CALL_INTERPRETING + :ivar output_index: The index of the output item in the response for which the code interpreter + is interpreting code. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the code interpreter tool call item. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_INTERPRETING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.code_interpreter_call.interpreting``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response for which the code interpreter is interpreting + code. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the code interpreter tool call item. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CODE_INTERPRETER_CALL_INTERPRETING # type: ignore + + +class ResponseCompletedEvent(ResponseStreamEvent, discriminator="response.completed"): + """Emitted when the model response is complete. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.completed``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_COMPLETED + :ivar response: Properties of the completed response. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.completed``. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Properties of the completed response. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_COMPLETED # type: ignore + + +class ResponseContentPartAddedEvent(ResponseStreamEvent, discriminator="response.content_part.added"): + """Emitted when a new content part is added. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.content_part.added``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CONTENT_PART_ADDED + :ivar item_id: The ID of the output item that the content part was added to. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the content part was added to. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that was added. Required. + :vartype content_index: int + :ivar part: The content part that was added. Required. + :vartype part: ~azure.ai.projects.models.ItemContent + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CONTENT_PART_ADDED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.content_part.added``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the content part was added to. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the content part was added to. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that was added. Required.""" + part: "_models.ItemContent" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content part that was added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + part: "_models.ItemContent", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CONTENT_PART_ADDED # type: ignore + + +class ResponseContentPartDoneEvent(ResponseStreamEvent, discriminator="response.content_part.done"): + """Emitted when a content part is done. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.content_part.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CONTENT_PART_DONE + :ivar item_id: The ID of the output item that the content part was added to. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the content part was added to. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that is done. Required. + :vartype content_index: int + :ivar part: The content part that is done. Required. + :vartype part: ~azure.ai.projects.models.ItemContent + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CONTENT_PART_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.content_part.done``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the content part was added to. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the content part was added to. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that is done. Required.""" + part: "_models.ItemContent" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content part that is done. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + part: "_models.ItemContent", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CONTENT_PART_DONE # type: ignore + + +class ResponseConversation1(_Model): + """ResponseConversation1. + + :ivar id: Required. + :vartype id: str + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseCreatedEvent(ResponseStreamEvent, discriminator="response.created"): + """An event that is emitted when a response is created. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.created``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_CREATED + :ivar response: The response that was created. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_CREATED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.created``. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response that was created. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_CREATED # type: ignore + + +class ResponseError(_Model): + """An error object returned when the model fails to generate a Response. + + :ivar code: Required. Known values are: "server_error", "rate_limit_exceeded", + "invalid_prompt", "vector_store_timeout", "invalid_image", "invalid_image_format", + "invalid_base64_image", "invalid_image_url", "image_too_large", "image_too_small", + "image_parse_error", "image_content_policy_violation", "invalid_image_mode", + "image_file_too_large", "unsupported_image_media_type", "empty_image_file", + "failed_to_download_image", and "image_file_not_found". + :vartype code: str or ~azure.ai.projects.models.ResponseErrorCode + :ivar message: A human-readable description of the error. Required. + :vartype message: str + """ + + code: Union[str, "_models.ResponseErrorCode"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required. Known values are: \"server_error\", \"rate_limit_exceeded\", \"invalid_prompt\", + \"vector_store_timeout\", \"invalid_image\", \"invalid_image_format\", + \"invalid_base64_image\", \"invalid_image_url\", \"image_too_large\", \"image_too_small\", + \"image_parse_error\", \"image_content_policy_violation\", \"invalid_image_mode\", + \"image_file_too_large\", \"unsupported_image_media_type\", \"empty_image_file\", + \"failed_to_download_image\", and \"image_file_not_found\".""" + message: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A human-readable description of the error. Required.""" + + @overload + def __init__( + self, + *, + code: Union[str, "_models.ResponseErrorCode"], + message: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseErrorEvent(ResponseStreamEvent, discriminator="error"): + """Emitted when an error occurs. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``error``. Required. + :vartype type: str or ~azure.ai.projects.models.ERROR + :ivar code: The error code. Required. + :vartype code: str + :ivar message: The error message. Required. + :vartype message: str + :ivar param: The error parameter. Required. + :vartype param: str + """ + + type: Literal[ResponseStreamEventType.ERROR] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``error``. Required.""" + code: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error code. Required.""" + message: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error message. Required.""" + param: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The error parameter. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + code: str, + message: str, + param: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.ERROR # type: ignore + + +class ResponseFailedEvent(ResponseStreamEvent, discriminator="response.failed"): + """An event that is emitted when a response fails. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.failed``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FAILED + :ivar response: The response that failed. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FAILED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.failed``. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response that failed. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FAILED # type: ignore + + +class ResponseFileSearchCallCompletedEvent(ResponseStreamEvent, discriminator="response.file_search_call.completed"): + """Emitted when a file search call is completed (results found). + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.file_search_call.completed``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FILE_SEARCH_CALL_COMPLETED + :ivar output_index: The index of the output item that the file search call is initiated. + Required. + :vartype output_index: int + :ivar item_id: The ID of the output item that the file search call is initiated. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.file_search_call.completed``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the file search call is initiated. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the file search call is initiated. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_COMPLETED # type: ignore + + +class ResponseFileSearchCallInProgressEvent(ResponseStreamEvent, discriminator="response.file_search_call.in_progress"): + """Emitted when a file search call is initiated. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.file_search_call.in_progress``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FILE_SEARCH_CALL_IN_PROGRESS + :ivar output_index: The index of the output item that the file search call is initiated. + Required. + :vartype output_index: int + :ivar item_id: The ID of the output item that the file search call is initiated. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.file_search_call.in_progress``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the file search call is initiated. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the file search call is initiated. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_IN_PROGRESS # type: ignore + + +class ResponseFileSearchCallSearchingEvent(ResponseStreamEvent, discriminator="response.file_search_call.searching"): + """Emitted when a file search is currently searching. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.file_search_call.searching``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FILE_SEARCH_CALL_SEARCHING + :ivar output_index: The index of the output item that the file search call is searching. + Required. + :vartype output_index: int + :ivar item_id: The ID of the output item that the file search call is initiated. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_SEARCHING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.file_search_call.searching``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the file search call is searching. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the file search call is initiated. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FILE_SEARCH_CALL_SEARCHING # type: ignore + + +class ResponseFormatJsonSchemaSchema(_Model): + """The schema for the response format, described as a JSON Schema object. + Learn how to build JSON schemas `here `_. + + """ + + +class ResponseFunctionCallArgumentsDeltaEvent( + ResponseStreamEvent, discriminator="response.function_call_arguments.delta" +): + """Emitted when there is a partial function-call arguments delta. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.function_call_arguments.delta``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FUNCTION_CALL_ARGUMENTS_DELTA + :ivar item_id: The ID of the output item that the function-call arguments delta is added to. + Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the function-call arguments delta is + added to. Required. + :vartype output_index: int + :ivar delta: The function-call arguments delta that is added. Required. + :vartype delta: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FUNCTION_CALL_ARGUMENTS_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.function_call_arguments.delta``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the function-call arguments delta is added to. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the function-call arguments delta is added to. Required.""" + delta: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The function-call arguments delta that is added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + delta: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FUNCTION_CALL_ARGUMENTS_DELTA # type: ignore + + +class ResponseFunctionCallArgumentsDoneEvent( + ResponseStreamEvent, discriminator="response.function_call_arguments.done" +): + """Emitted when function-call arguments are finalized. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_FUNCTION_CALL_ARGUMENTS_DONE + :ivar item_id: The ID of the item. Required. + :vartype item_id: str + :ivar output_index: The index of the output item. Required. + :vartype output_index: int + :ivar arguments: The function-call arguments. Required. + :vartype arguments: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_FUNCTION_CALL_ARGUMENTS_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the item. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item. Required.""" + arguments: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The function-call arguments. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + arguments: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_FUNCTION_CALL_ARGUMENTS_DONE # type: ignore + + +class ResponseImageGenCallCompletedEvent(ResponseStreamEvent, discriminator="response.image_generation_call.completed"): + """Emitted when an image generation tool call has completed and the final image is available. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.image_generation_call.completed'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_IMAGE_GENERATION_CALL_COMPLETED + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the image generation item being processed. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.image_generation_call.completed'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the image generation item being processed. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_COMPLETED # type: ignore + + +class ResponseImageGenCallGeneratingEvent( + ResponseStreamEvent, discriminator="response.image_generation_call.generating" +): + """Emitted when an image generation tool call is actively generating an image (intermediate + state). + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.image_generation_call.generating'. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_IMAGE_GENERATION_CALL_GENERATING + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the image generation item being processed. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_GENERATING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.image_generation_call.generating'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the image generation item being processed. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_GENERATING # type: ignore + + +class ResponseImageGenCallInProgressEvent( + ResponseStreamEvent, discriminator="response.image_generation_call.in_progress" +): + """Emitted when an image generation tool call is in progress. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.image_generation_call.in_progress'. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_IMAGE_GENERATION_CALL_IN_PROGRESS + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the image generation item being processed. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.image_generation_call.in_progress'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the image generation item being processed. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_IN_PROGRESS # type: ignore + + +class ResponseImageGenCallPartialImageEvent( + ResponseStreamEvent, discriminator="response.image_generation_call.partial_image" +): + """Emitted when a partial image is available during image generation streaming. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.image_generation_call.partial_image'. + Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_IMAGE_GENERATION_CALL_PARTIAL_IMAGE + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the image generation item being processed. Required. + :vartype item_id: str + :ivar partial_image_index: 0-based index for the partial image (backend is 1-based, but this is + 0-based for the user). Required. + :vartype partial_image_index: int + :ivar partial_image_b64: Base64-encoded partial image data, suitable for rendering as an image. + Required. + :vartype partial_image_b64: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_PARTIAL_IMAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.image_generation_call.partial_image'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the image generation item being processed. Required.""" + partial_image_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """0-based index for the partial image (backend is 1-based, but this is 0-based for the user). + Required.""" + partial_image_b64: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Base64-encoded partial image data, suitable for rendering as an image. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + partial_image_index: int, + partial_image_b64: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_IMAGE_GENERATION_CALL_PARTIAL_IMAGE # type: ignore + + +class ResponseIncompleteDetails1(_Model): + """ResponseIncompleteDetails1. + + :ivar reason: The reason why the response is incomplete. Is either a + Literal["max_output_tokens"] type or a Literal["content_filter"] type. + :vartype reason: str or str + """ + + reason: Optional[Literal["max_output_tokens", "content_filter"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The reason why the response is incomplete. Is either a Literal[\"max_output_tokens\"] type or a + Literal[\"content_filter\"] type.""" + + @overload + def __init__( + self, + *, + reason: Optional[Literal["max_output_tokens", "content_filter"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseIncompleteEvent(ResponseStreamEvent, discriminator="response.incomplete"): + """An event that is emitted when a response finishes as incomplete. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.incomplete``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_INCOMPLETE + :ivar response: The response that was incomplete. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_INCOMPLETE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.incomplete``. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response that was incomplete. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_INCOMPLETE # type: ignore + + +class ResponseInProgressEvent(ResponseStreamEvent, discriminator="response.in_progress"): + """Emitted when the response is in progress. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.in_progress``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_IN_PROGRESS + :ivar response: The response that is in progress. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.in_progress``. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The response that is in progress. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_IN_PROGRESS # type: ignore + + +class ResponseMCPCallArgumentsDeltaEvent(ResponseStreamEvent, discriminator="response.mcp_call.arguments_delta"): + """Emitted when there is a delta (partial update) to the arguments of an MCP tool call. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_call.arguments_delta'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_CALL_ARGUMENTS_DELTA + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the MCP tool call item being processed. Required. + :vartype item_id: str + :ivar delta: The partial update to the arguments for the MCP tool call. Required. + :vartype delta: any + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_CALL_ARGUMENTS_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_call.arguments_delta'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the MCP tool call item being processed. Required.""" + delta: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The partial update to the arguments for the MCP tool call. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + delta: Any, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_CALL_ARGUMENTS_DELTA # type: ignore + + +class ResponseMCPCallArgumentsDoneEvent(ResponseStreamEvent, discriminator="response.mcp_call.arguments_done"): + """Emitted when the arguments for an MCP tool call are finalized. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_call.arguments_done'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_CALL_ARGUMENTS_DONE + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the MCP tool call item being processed. Required. + :vartype item_id: str + :ivar arguments: The finalized arguments for the MCP tool call. Required. + :vartype arguments: any + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_CALL_ARGUMENTS_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_call.arguments_done'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the MCP tool call item being processed. Required.""" + arguments: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The finalized arguments for the MCP tool call. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + arguments: Any, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_CALL_ARGUMENTS_DONE # type: ignore + + +class ResponseMCPCallCompletedEvent(ResponseStreamEvent, discriminator="response.mcp_call.completed"): + """Emitted when an MCP tool call has completed successfully. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_call.completed'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_CALL_COMPLETED + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_CALL_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_call.completed'. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_CALL_COMPLETED # type: ignore + + +class ResponseMCPCallFailedEvent(ResponseStreamEvent, discriminator="response.mcp_call.failed"): + """Emitted when an MCP tool call has failed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_call.failed'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_CALL_FAILED + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_CALL_FAILED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_call.failed'. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_CALL_FAILED # type: ignore + + +class ResponseMCPCallInProgressEvent(ResponseStreamEvent, discriminator="response.mcp_call.in_progress"): + """Emitted when an MCP tool call is in progress. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_call.in_progress'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_CALL_IN_PROGRESS + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar item_id: The unique identifier of the MCP tool call item being processed. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_CALL_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_call.in_progress'. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the MCP tool call item being processed. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_CALL_IN_PROGRESS # type: ignore + + +class ResponseMCPListToolsCompletedEvent(ResponseStreamEvent, discriminator="response.mcp_list_tools.completed"): + """Emitted when the list of available MCP tools has been successfully retrieved. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_list_tools.completed'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_LIST_TOOLS_COMPLETED + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_list_tools.completed'. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_COMPLETED # type: ignore + + +class ResponseMCPListToolsFailedEvent(ResponseStreamEvent, discriminator="response.mcp_list_tools.failed"): + """Emitted when the attempt to list available MCP tools has failed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_list_tools.failed'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_LIST_TOOLS_FAILED + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_FAILED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_list_tools.failed'. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_FAILED # type: ignore + + +class ResponseMCPListToolsInProgressEvent(ResponseStreamEvent, discriminator="response.mcp_list_tools.in_progress"): + """Emitted when the system is in the process of retrieving the list of available MCP tools. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.mcp_list_tools.in_progress'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_MCP_LIST_TOOLS_IN_PROGRESS + """ + + type: Literal[ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.mcp_list_tools.in_progress'. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_MCP_LIST_TOOLS_IN_PROGRESS # type: ignore + + +class ResponseOutputItemAddedEvent(ResponseStreamEvent, discriminator="response.output_item.added"): + """Emitted when a new output item is added. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.output_item.added``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_OUTPUT_ITEM_ADDED + :ivar output_index: The index of the output item that was added. Required. + :vartype output_index: int + :ivar item: The output item that was added. Required. + :vartype item: ~azure.ai.projects.models.ItemResource + """ + + type: Literal[ResponseStreamEventType.RESPONSE_OUTPUT_ITEM_ADDED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.output_item.added``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that was added. Required.""" + item: "_models.ItemResource" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The output item that was added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item: "_models.ItemResource", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_OUTPUT_ITEM_ADDED # type: ignore + + +class ResponseOutputItemDoneEvent(ResponseStreamEvent, discriminator="response.output_item.done"): + """Emitted when an output item is marked done. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.output_item.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_OUTPUT_ITEM_DONE + :ivar output_index: The index of the output item that was marked done. Required. + :vartype output_index: int + :ivar item: The output item that was marked done. Required. + :vartype item: ~azure.ai.projects.models.ItemResource + """ + + type: Literal[ResponseStreamEventType.RESPONSE_OUTPUT_ITEM_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.output_item.done``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that was marked done. Required.""" + item: "_models.ItemResource" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The output item that was marked done. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item: "_models.ItemResource", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_OUTPUT_ITEM_DONE # type: ignore + + +class ResponsePromptVariables(_Model): + """Optional map of values to substitute in for variables in your + prompt. The substitution values can either be strings, or other + Response input types like images or files. + + """ + + +class ResponseQueuedEvent(ResponseStreamEvent, discriminator="response.queued"): + """Emitted when a response is queued and waiting to be processed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.queued'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_QUEUED + :ivar response: The full response object that is queued. Required. + :vartype response: ~azure.ai.projects.models.Response + """ + + type: Literal[ResponseStreamEventType.RESPONSE_QUEUED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.queued'. Required.""" + response: "_models.Response" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The full response object that is queued. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + response: "_models.Response", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_QUEUED # type: ignore + + +class ResponseReasoningDeltaEvent(ResponseStreamEvent, discriminator="response.reasoning.delta"): + """Emitted when there is a delta (partial update) to the reasoning content. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.reasoning.delta'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_DELTA + :ivar item_id: The unique identifier of the item for which reasoning is being updated. + Required. + :vartype item_id: str + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar content_index: The index of the reasoning content part within the output item. Required. + :vartype content_index: int + :ivar delta: The partial update to the reasoning content. Required. + :vartype delta: any + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.reasoning.delta'. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the item for which reasoning is being updated. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the reasoning content part within the output item. Required.""" + delta: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The partial update to the reasoning content. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + delta: Any, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_DELTA # type: ignore + + +class ResponseReasoningDoneEvent(ResponseStreamEvent, discriminator="response.reasoning.done"): + """Emitted when the reasoning content is finalized for an item. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.reasoning.done'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_DONE + :ivar item_id: The unique identifier of the item for which reasoning is finalized. Required. + :vartype item_id: str + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar content_index: The index of the reasoning content part within the output item. Required. + :vartype content_index: int + :ivar text: The finalized reasoning text. Required. + :vartype text: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.reasoning.done'. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the item for which reasoning is finalized. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the reasoning content part within the output item. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The finalized reasoning text. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_DONE # type: ignore + + +class ResponseReasoningSummaryDeltaEvent(ResponseStreamEvent, discriminator="response.reasoning_summary.delta"): + """Emitted when there is a delta (partial update) to the reasoning summary content. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.reasoning_summary.delta'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_DELTA + :ivar item_id: The unique identifier of the item for which the reasoning summary is being + updated. Required. + :vartype item_id: str + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the output item. Required. + :vartype summary_index: int + :ivar delta: The partial update to the reasoning summary content. Required. + :vartype delta: any + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.reasoning_summary.delta'. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the item for which the reasoning summary is being updated. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the output item. Required.""" + delta: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The partial update to the reasoning summary content. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + delta: Any, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_DELTA # type: ignore + + +class ResponseReasoningSummaryDoneEvent(ResponseStreamEvent, discriminator="response.reasoning_summary.done"): + """Emitted when the reasoning summary content is finalized for an item. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always 'response.reasoning_summary.done'. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_DONE + :ivar item_id: The unique identifier of the item for which the reasoning summary is finalized. + Required. + :vartype item_id: str + :ivar output_index: The index of the output item in the response's output array. Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the output item. Required. + :vartype summary_index: int + :ivar text: The finalized reasoning summary text. Required. + :vartype text: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always 'response.reasoning_summary.done'. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier of the item for which the reasoning summary is finalized. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item in the response's output array. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the output item. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The finalized reasoning summary text. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_DONE # type: ignore + + +class ResponseReasoningSummaryPartAddedEvent( + ResponseStreamEvent, discriminator="response.reasoning_summary_part.added" +): + """Emitted when a new reasoning summary part is added. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.reasoning_summary_part.added``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_PART_ADDED + :ivar item_id: The ID of the item this summary part is associated with. Required. + :vartype item_id: str + :ivar output_index: The index of the output item this summary part is associated with. + Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the reasoning summary. Required. + :vartype summary_index: int + :ivar part: The summary part that was added. Required. + :vartype part: ~azure.ai.projects.models.ReasoningItemSummaryPart + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_PART_ADDED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.reasoning_summary_part.added``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the item this summary part is associated with. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item this summary part is associated with. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the reasoning summary. Required.""" + part: "_models.ReasoningItemSummaryPart" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The summary part that was added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + part: "_models.ReasoningItemSummaryPart", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_PART_ADDED # type: ignore + + +class ResponseReasoningSummaryPartDoneEvent(ResponseStreamEvent, discriminator="response.reasoning_summary_part.done"): + """Emitted when a reasoning summary part is completed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.reasoning_summary_part.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_PART_DONE + :ivar item_id: The ID of the item this summary part is associated with. Required. + :vartype item_id: str + :ivar output_index: The index of the output item this summary part is associated with. + Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the reasoning summary. Required. + :vartype summary_index: int + :ivar part: The completed summary part. Required. + :vartype part: ~azure.ai.projects.models.ReasoningItemSummaryPart + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_PART_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.reasoning_summary_part.done``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the item this summary part is associated with. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item this summary part is associated with. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the reasoning summary. Required.""" + part: "_models.ReasoningItemSummaryPart" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The completed summary part. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + part: "_models.ReasoningItemSummaryPart", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_PART_DONE # type: ignore + + +class ResponseReasoningSummaryTextDeltaEvent( + ResponseStreamEvent, discriminator="response.reasoning_summary_text.delta" +): + """Emitted when a delta is added to a reasoning summary text. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.reasoning_summary_text.delta``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_TEXT_DELTA + :ivar item_id: The ID of the item this summary text delta is associated with. Required. + :vartype item_id: str + :ivar output_index: The index of the output item this summary text delta is associated with. + Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the reasoning summary. Required. + :vartype summary_index: int + :ivar delta: The text delta that was added to the summary. Required. + :vartype delta: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_TEXT_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.reasoning_summary_text.delta``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the item this summary text delta is associated with. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item this summary text delta is associated with. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the reasoning summary. Required.""" + delta: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text delta that was added to the summary. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + delta: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_TEXT_DELTA # type: ignore + + +class ResponseReasoningSummaryTextDoneEvent(ResponseStreamEvent, discriminator="response.reasoning_summary_text.done"): + """Emitted when a reasoning summary text is completed. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.reasoning_summary_text.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REASONING_SUMMARY_TEXT_DONE + :ivar item_id: The ID of the item this summary text is associated with. Required. + :vartype item_id: str + :ivar output_index: The index of the output item this summary text is associated with. + Required. + :vartype output_index: int + :ivar summary_index: The index of the summary part within the reasoning summary. Required. + :vartype summary_index: int + :ivar text: The full text of the completed reasoning summary. Required. + :vartype text: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_TEXT_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.reasoning_summary_text.done``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the item this summary text is associated with. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item this summary text is associated with. Required.""" + summary_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the summary part within the reasoning summary. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The full text of the completed reasoning summary. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + summary_index: int, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REASONING_SUMMARY_TEXT_DONE # type: ignore + + +class ResponseRefusalDeltaEvent(ResponseStreamEvent, discriminator="response.refusal.delta"): + """Emitted when there is a partial refusal text. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.refusal.delta``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REFUSAL_DELTA + :ivar item_id: The ID of the output item that the refusal text is added to. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the refusal text is added to. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that the refusal text is added to. Required. + :vartype content_index: int + :ivar delta: The refusal text that is added. Required. + :vartype delta: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REFUSAL_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.refusal.delta``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the refusal text is added to. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the refusal text is added to. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that the refusal text is added to. Required.""" + delta: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The refusal text that is added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + delta: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REFUSAL_DELTA # type: ignore + + +class ResponseRefusalDoneEvent(ResponseStreamEvent, discriminator="response.refusal.done"): + """Emitted when refusal text is finalized. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.refusal.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_REFUSAL_DONE + :ivar item_id: The ID of the output item that the refusal text is finalized. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the refusal text is finalized. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that the refusal text is finalized. + Required. + :vartype content_index: int + :ivar refusal: The refusal text that is finalized. Required. + :vartype refusal: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_REFUSAL_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.refusal.done``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the refusal text is finalized. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the refusal text is finalized. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that the refusal text is finalized. Required.""" + refusal: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The refusal text that is finalized. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + refusal: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_REFUSAL_DONE # type: ignore + + +class ResponsesMessageItemParam(ItemParam, discriminator="message"): + """A response message item, representing a role and content, as provided as client request + parameters. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ResponsesAssistantMessageItemParam, ResponsesDeveloperMessageItemParam, + ResponsesSystemMessageItemParam, ResponsesUserMessageItemParam + + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar role: The role associated with the message. Required. Known values are: "system", + "developer", "user", and "assistant". + :vartype role: str or ~azure.ai.projects.models.ResponsesMessageRole + """ + + __mapping__: dict[str, _Model] = {} + type: Literal[ItemType.MESSAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the responses item, which is always 'message'. Required.""" + role: str = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) + """The role associated with the message. Required. Known values are: \"system\", \"developer\", + \"user\", and \"assistant\".""" + + @overload + def __init__( + self, + *, + role: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MESSAGE # type: ignore + + +class ResponsesAssistantMessageItemParam(ResponsesMessageItemParam, discriminator="assistant"): + """A message parameter item with the ``assistant`` role. + + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar role: The role of the message, which is always ``assistant``. Required. + :vartype role: str or ~azure.ai.projects.models.ASSISTANT + :ivar content: The content associated with the message. Required. Is either a str type or a + [ItemContent] type. + :vartype content: str or list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.ASSISTANT] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``assistant``. Required.""" + content: Union["str", list["_models.ItemContent"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The content associated with the message. Required. Is either a str type or a [ItemContent] + type.""" + + @overload + def __init__( + self, + *, + content: Union[str, list["_models.ItemContent"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.ASSISTANT # type: ignore + + +class ResponsesMessageItemResource(ItemResource, discriminator="message"): + """A response message resource item, representing a role and content, as provided on service + responses. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ResponsesAssistantMessageItemResource, ResponsesDeveloperMessageItemResource, + ResponsesSystemMessageItemResource, ResponsesUserMessageItemResource + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar role: The role associated with the message. Required. Known values are: "system", + "developer", "user", and "assistant". + :vartype role: str or ~azure.ai.projects.models.ResponsesMessageRole + """ + + __mapping__: dict[str, _Model] = {} + type: Literal[ItemType.MESSAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the responses item, which is always 'message'. Required.""" + status: Literal["in_progress", "completed", "incomplete"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal[\"in_progress\"], Literal[\"completed\"], Literal[\"incomplete\"]""" + role: str = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) + """The role associated with the message. Required. Known values are: \"system\", \"developer\", + \"user\", and \"assistant\".""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + role: str, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.MESSAGE # type: ignore + + +class ResponsesAssistantMessageItemResource(ResponsesMessageItemResource, discriminator="assistant"): + """A message resource item with the ``assistant`` role. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar role: The role of the message, which is always ``assistant``. Required. + :vartype role: str or ~azure.ai.projects.models.ASSISTANT + :ivar content: The content associated with the message. Required. + :vartype content: list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.ASSISTANT] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``assistant``. Required.""" + content: list["_models.ItemContent"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content associated with the message. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + content: list["_models.ItemContent"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.ASSISTANT # type: ignore + + +class ResponsesDeveloperMessageItemParam(ResponsesMessageItemParam, discriminator="developer"): + """A message parameter item with the ``developer`` role. + + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar role: The role of the message, which is always ``developer``. Required. + :vartype role: str or ~azure.ai.projects.models.DEVELOPER + :ivar content: The content associated with the message. Required. Is either a str type or a + [ItemContent] type. + :vartype content: str or list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.DEVELOPER] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``developer``. Required.""" + content: Union["str", list["_models.ItemContent"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The content associated with the message. Required. Is either a str type or a [ItemContent] + type.""" + + @overload + def __init__( + self, + *, + content: Union[str, list["_models.ItemContent"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.DEVELOPER # type: ignore + + +class ResponsesDeveloperMessageItemResource(ResponsesMessageItemResource, discriminator="developer"): + """A message resource item with the ``developer`` role. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar role: The role of the message, which is always ``developer``. Required. + :vartype role: str or ~azure.ai.projects.models.DEVELOPER + :ivar content: The content associated with the message. Required. + :vartype content: list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.DEVELOPER] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``developer``. Required.""" + content: list["_models.ItemContent"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content associated with the message. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + content: list["_models.ItemContent"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.DEVELOPER # type: ignore + + +class ResponsesSystemMessageItemParam(ResponsesMessageItemParam, discriminator="system"): + """A message parameter item with the ``system`` role. + + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar role: The role of the message, which is always ``system``. Required. + :vartype role: str or ~azure.ai.projects.models.SYSTEM + :ivar content: The content associated with the message. Required. Is either a str type or a + [ItemContent] type. + :vartype content: str or list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.SYSTEM] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``system``. Required.""" + content: Union["str", list["_models.ItemContent"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The content associated with the message. Required. Is either a str type or a [ItemContent] + type.""" + + @overload + def __init__( + self, + *, + content: Union[str, list["_models.ItemContent"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.SYSTEM # type: ignore + + +class ResponsesSystemMessageItemResource(ResponsesMessageItemResource, discriminator="system"): + """A message resource item with the ``system`` role. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar role: The role of the message, which is always ``system``. Required. + :vartype role: str or ~azure.ai.projects.models.SYSTEM + :ivar content: The content associated with the message. Required. + :vartype content: list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.SYSTEM] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``system``. Required.""" + content: list["_models.ItemContent"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content associated with the message. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + content: list["_models.ItemContent"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.SYSTEM # type: ignore + + +class ResponsesUserMessageItemParam(ResponsesMessageItemParam, discriminator="user"): + """A message parameter item with the ``user`` role. + + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar role: The role of the message, which is always ``user``. Required. + :vartype role: str or ~azure.ai.projects.models.USER + :ivar content: The content associated with the message. Required. Is either a str type or a + [ItemContent] type. + :vartype content: str or list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.USER] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``user``. Required.""" + content: Union["str", list["_models.ItemContent"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The content associated with the message. Required. Is either a str type or a [ItemContent] + type.""" + + @overload + def __init__( + self, + *, + content: Union[str, list["_models.ItemContent"]], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.USER # type: ignore + + +class ResponsesUserMessageItemResource(ResponsesMessageItemResource, discriminator="user"): + """A message resource item with the ``user`` role. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: The type of the responses item, which is always 'message'. Required. + :vartype type: str or ~azure.ai.projects.models.MESSAGE + :ivar status: The status of the item. One of ``in_progress``, ``completed``, or + ``incomplete``. Populated when items are returned via API. Required. Is one of the following + types: Literal["in_progress"], Literal["completed"], Literal["incomplete"] + :vartype status: str or str or str + :ivar role: The role of the message, which is always ``user``. Required. + :vartype role: str or ~azure.ai.projects.models.USER + :ivar content: The content associated with the message. Required. + :vartype content: list[~azure.ai.projects.models.ItemContent] + """ + + __mapping__: dict[str, _Model] = {} + role: Literal[ResponsesMessageRole.USER] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The role of the message, which is always ``user``. Required.""" + content: list["_models.ItemContent"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The content associated with the message. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "completed", "incomplete"], + content: list["_models.ItemContent"], + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.role = ResponsesMessageRole.USER # type: ignore + + +class ResponseText(_Model): + """ResponseText. + + :ivar format: + :vartype format: ~azure.ai.projects.models.ResponseTextFormatConfiguration + """ + + format: Optional["_models.ResponseTextFormatConfiguration"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + + @overload + def __init__( + self, + *, + format: Optional["_models.ResponseTextFormatConfiguration"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseTextDeltaEvent(ResponseStreamEvent, discriminator="response.output_text.delta"): + """Emitted when there is an additional text delta. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.output_text.delta``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_OUTPUT_TEXT_DELTA + :ivar item_id: The ID of the output item that the text delta was added to. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the text delta was added to. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that the text delta was added to. Required. + :vartype content_index: int + :ivar delta: The text delta that was added. Required. + :vartype delta: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_OUTPUT_TEXT_DELTA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.output_text.delta``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the text delta was added to. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the text delta was added to. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that the text delta was added to. Required.""" + delta: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text delta that was added. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + delta: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_OUTPUT_TEXT_DELTA # type: ignore + + +class ResponseTextDoneEvent(ResponseStreamEvent, discriminator="response.output_text.done"): + """Emitted when text content is finalized. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.output_text.done``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_OUTPUT_TEXT_DONE + :ivar item_id: The ID of the output item that the text content is finalized. Required. + :vartype item_id: str + :ivar output_index: The index of the output item that the text content is finalized. Required. + :vartype output_index: int + :ivar content_index: The index of the content part that the text content is finalized. + Required. + :vartype content_index: int + :ivar text: The text content that is finalized. Required. + :vartype text: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_OUTPUT_TEXT_DONE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.output_text.done``. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The ID of the output item that the text content is finalized. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the text content is finalized. Required.""" + content_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the content part that the text content is finalized. Required.""" + text: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The text content that is finalized. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + item_id: str, + output_index: int, + content_index: int, + text: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_OUTPUT_TEXT_DONE # type: ignore + + +class ResponseTextFormatConfiguration(_Model): + """ResponseTextFormatConfiguration. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ResponseTextFormatConfigurationJsonObject, ResponseTextFormatConfigurationJsonSchema, + ResponseTextFormatConfigurationText + + :ivar type: Required. Known values are: "text", "json_schema", and "json_object". + :vartype type: str or ~azure.ai.projects.models.ResponseTextFormatConfigurationType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"text\", \"json_schema\", and \"json_object\".""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseTextFormatConfigurationJsonObject( + ResponseTextFormatConfiguration, discriminator="json_object" +): # pylint: disable=name-too-long + """ResponseTextFormatConfigurationJsonObject. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.JSON_OBJECT + """ + + type: Literal[ResponseTextFormatConfigurationType.JSON_OBJECT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseTextFormatConfigurationType.JSON_OBJECT # type: ignore + + +class ResponseTextFormatConfigurationJsonSchema( + ResponseTextFormatConfiguration, discriminator="json_schema" +): # pylint: disable=name-too-long + """JSON Schema response format. Used to generate structured JSON responses. + Learn more about `Structured Outputs `_. + + :ivar type: The type of response format being defined. Always ``json_schema``. Required. + :vartype type: str or ~azure.ai.projects.models.JSON_SCHEMA + :ivar description: A description of what the response format is for, used by the model to + determine how to respond in the format. + :vartype description: str + :ivar name: The name of the response format. Must be a-z, A-Z, 0-9, or contain + underscores and dashes, with a maximum length of 64. Required. + :vartype name: str + :ivar schema: Required. + :vartype schema: ~azure.ai.projects.models.ResponseFormatJsonSchemaSchema + :ivar strict: Whether to enable strict schema adherence when generating the output. + If set to true, the model will always follow the exact schema defined + in the ``schema`` field. Only a subset of JSON Schema is supported when + ``strict`` is ``true``. To learn more, read the `Structured Outputs + guide `_. + :vartype strict: bool + """ + + type: Literal[ResponseTextFormatConfigurationType.JSON_SCHEMA] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of response format being defined. Always ``json_schema``. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of what the response format is for, used by the model to + determine how to respond in the format.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the response format. Must be a-z, A-Z, 0-9, or contain + underscores and dashes, with a maximum length of 64. Required.""" + schema: "_models.ResponseFormatJsonSchemaSchema" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Required.""" + strict: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to enable strict schema adherence when generating the output. + If set to true, the model will always follow the exact schema defined + in the ``schema`` field. Only a subset of JSON Schema is supported when + ``strict`` is ``true``. To learn more, read the `Structured Outputs + guide `_.""" + + @overload + def __init__( + self, + *, + name: str, + schema: "_models.ResponseFormatJsonSchemaSchema", + description: Optional[str] = None, + strict: Optional[bool] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseTextFormatConfigurationType.JSON_SCHEMA # type: ignore + + +class ResponseTextFormatConfigurationText(ResponseTextFormatConfiguration, discriminator="text"): + """ResponseTextFormatConfigurationText. + + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.TEXT + """ + + type: Literal[ResponseTextFormatConfigurationType.TEXT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseTextFormatConfigurationType.TEXT # type: ignore + + +class ResponseUsage(_Model): + """Represents token usage details including input tokens, output tokens, + a breakdown of output tokens, and the total tokens used. + + :ivar input_tokens: The number of input tokens. Required. + :vartype input_tokens: int + :ivar input_tokens_details: A detailed breakdown of the input tokens. Required. + :vartype input_tokens_details: + ~azure.ai.projects.models.MemoryStoreOperationUsageInputTokensDetails + :ivar output_tokens: The number of output tokens. Required. + :vartype output_tokens: int + :ivar output_tokens_details: A detailed breakdown of the output tokens. Required. + :vartype output_tokens_details: + ~azure.ai.projects.models.MemoryStoreOperationUsageOutputTokensDetails + :ivar total_tokens: The total number of tokens used. Required. + :vartype total_tokens: int + """ + + input_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of input tokens. Required.""" + input_tokens_details: "_models.MemoryStoreOperationUsageInputTokensDetails" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A detailed breakdown of the input tokens. Required.""" + output_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The number of output tokens. Required.""" + output_tokens_details: "_models.MemoryStoreOperationUsageOutputTokensDetails" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """A detailed breakdown of the output tokens. Required.""" + total_tokens: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The total number of tokens used. Required.""" + + @overload + def __init__( + self, + *, + input_tokens: int, + input_tokens_details: "_models.MemoryStoreOperationUsageInputTokensDetails", + output_tokens: int, + output_tokens_details: "_models.MemoryStoreOperationUsageOutputTokensDetails", + total_tokens: int, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ResponseWebSearchCallCompletedEvent(ResponseStreamEvent, discriminator="response.web_search_call.completed"): + """Note: web_search is not yet available via Azure OpenAI. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.web_search_call.completed``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_WEB_SEARCH_CALL_COMPLETED + :ivar output_index: The index of the output item that the web search call is associated with. + Required. + :vartype output_index: int + :ivar item_id: Unique ID for the output item associated with the web search call. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_COMPLETED] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.web_search_call.completed``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the web search call is associated with. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique ID for the output item associated with the web search call. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_COMPLETED # type: ignore + + +class ResponseWebSearchCallInProgressEvent(ResponseStreamEvent, discriminator="response.web_search_call.in_progress"): + """Note: web_search is not yet available via Azure OpenAI. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.web_search_call.in_progress``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_WEB_SEARCH_CALL_IN_PROGRESS + :ivar output_index: The index of the output item that the web search call is associated with. + Required. + :vartype output_index: int + :ivar item_id: Unique ID for the output item associated with the web search call. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_IN_PROGRESS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.web_search_call.in_progress``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the web search call is associated with. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique ID for the output item associated with the web search call. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_IN_PROGRESS # type: ignore + + +class ResponseWebSearchCallSearchingEvent(ResponseStreamEvent, discriminator="response.web_search_call.searching"): + """Note: web_search is not yet available via Azure OpenAI. + + :ivar sequence_number: The sequence number for this event. Required. + :vartype sequence_number: int + :ivar type: The type of the event. Always ``response.web_search_call.searching``. Required. + :vartype type: str or ~azure.ai.projects.models.RESPONSE_WEB_SEARCH_CALL_SEARCHING + :ivar output_index: The index of the output item that the web search call is associated with. + Required. + :vartype output_index: int + :ivar item_id: Unique ID for the output item associated with the web search call. Required. + :vartype item_id: str + """ + + type: Literal[ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_SEARCHING] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the event. Always ``response.web_search_call.searching``. Required.""" + output_index: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The index of the output item that the web search call is associated with. Required.""" + item_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique ID for the output item associated with the web search call. Required.""" + + @overload + def __init__( + self, + *, + sequence_number: int, + output_index: int, + item_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ResponseStreamEventType.RESPONSE_WEB_SEARCH_CALL_SEARCHING # type: ignore + + +class SASCredentials(BaseCredentials, discriminator="SAS"): + """Shared Access Signature (SAS) credential definition. + + :ivar type: The credential type. Required. Shared Access Signature (SAS) credential + :vartype type: str or ~azure.ai.projects.models.SAS + :ivar sas_token: SAS token. + :vartype sas_token: str """ - sas_uri: str = rest_field(name="sasUri", visibility=["read"]) - """SAS uri. Required.""" - type: Literal["SAS"] = rest_field(visibility=["read"]) - """Type of credential. Required. Default value is \"SAS\".""" + type: Literal[CredentialType.SAS] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """The credential type. Required. Shared Access Signature (SAS) credential""" + sas_token: Optional[str] = rest_field(name="SAS", visibility=["read"]) + """SAS token.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type: Literal["SAS"] = "SAS" + self.type = CredentialType.SAS # type: ignore -class Connection(_Model): - """Response from the list and get connections operations. +class Schedule(_Model): + """Schedule model. - :ivar name: The friendly name of the connection, provided by the user. Required. - :vartype name: str - :ivar id: A unique identifier for the connection, generated by the service. Required. + :ivar id: Identifier of the schedule. Required. :vartype id: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar credentials: The credentials used by the connection. Required. - :vartype credentials: ~azure.ai.projects.models.BaseCredentials - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] + :ivar display_name: Name of the schedule. + :vartype display_name: str + :ivar description: Description of the schedule. + :vartype description: str + :ivar enabled: Enabled status of the schedule. Required. + :vartype enabled: bool + :ivar provisioning_status: Provisioning status of the schedule. Known values are: "Creating", + "Updating", "Deleting", "Succeeded", and "Failed". + :vartype provisioning_status: str or ~azure.ai.projects.models.ScheduleProvisioningStatus + :ivar trigger: Trigger for the schedule. Required. + :vartype trigger: ~azure.ai.projects.models.Trigger + :ivar task: Task for the schedule. Required. + :vartype task: ~azure.ai.projects.models.ScheduleTask + :ivar tags: Schedule's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Schedule's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar system_data: System metadata for the resource. Required. + :vartype system_data: dict[str, str] """ - name: str = rest_field(visibility=["read"]) - """The friendly name of the connection, provided by the user. Required.""" id: str = rest_field(visibility=["read"]) - """A unique identifier for the connection, generated by the service. Required.""" - type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) - """Category of the connection. Required. Known values are: \"AzureOpenAI\", \"AzureBlob\", - \"AzureStorageAccount\", \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppConfig\", - \"AppInsights\", and \"CustomKeys\".""" - target: str = rest_field(visibility=["read"]) - """The connection URL to be used for this service. Required.""" - is_default: bool = rest_field(name="isDefault", visibility=["read"]) - """Whether the connection is tagged as the default connection of its type. Required.""" - credentials: "_models.BaseCredentials" = rest_field(visibility=["read"]) - """The credentials used by the connection. Required.""" - metadata: dict[str, str] = rest_field(visibility=["read"]) - """Metadata of the connection. Required.""" + """Identifier of the schedule. Required.""" + display_name: Optional[str] = rest_field( + name="displayName", visibility=["read", "create", "update", "delete", "query"] + ) + """Name of the schedule.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the schedule.""" + enabled: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Enabled status of the schedule. Required.""" + provisioning_status: Optional[Union[str, "_models.ScheduleProvisioningStatus"]] = rest_field( + name="provisioningStatus", visibility=["read"] + ) + """Provisioning status of the schedule. Known values are: \"Creating\", \"Updating\", + \"Deleting\", \"Succeeded\", and \"Failed\".""" + trigger: "_models.Trigger" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Trigger for the schedule. Required.""" + task: "_models.ScheduleTask" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Task for the schedule. Required.""" + tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Schedule's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Schedule's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + system_data: dict[str, str] = rest_field(name="systemData", visibility=["read"]) + """System metadata for the resource. Required.""" + @overload + def __init__( + self, + *, + enabled: bool, + trigger: "_models.Trigger", + task: "_models.ScheduleTask", + display_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[dict[str, str]] = None, + properties: Optional[dict[str, str]] = None, + ) -> None: ... -class CosmosDBIndex(Index, discriminator="CosmosDBNoSqlVectorStore"): - """CosmosDB Vector Store Index Definition. + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ - :ivar id: Asset ID, a unique identifier for the asset. + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ScheduleRun(_Model): + """Schedule run model. + + :ivar id: Identifier of the schedule run. Required. :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - :ivar type: Type of index. Required. CosmosDB - :vartype type: str or ~azure.ai.projects.models.COSMOS_DB - :ivar connection_name: Name of connection to CosmosDB. Required. - :vartype connection_name: str - :ivar database_name: Name of the CosmosDB Database. Required. - :vartype database_name: str - :ivar container_name: Name of CosmosDB Container. Required. - :vartype container_name: str - :ivar embedding_configuration: Embedding model configuration. Required. - :vartype embedding_configuration: ~azure.ai.projects.models.EmbeddingConfiguration - :ivar field_mapping: Field mapping configuration. Required. - :vartype field_mapping: ~azure.ai.projects.models.FieldMapping + :ivar schedule_id: Identifier of the schedule. Required. + :vartype schedule_id: str + :ivar success: Trigger success status of the schedule run. Required. + :vartype success: bool + :ivar trigger_time: Trigger time of the schedule run. + :vartype trigger_time: str + :ivar error: Error information for the schedule run. + :vartype error: str + :ivar properties: Properties of the schedule run. Required. + :vartype properties: dict[str, str] """ - type: Literal[IndexType.COSMOS_DB] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Type of index. Required. CosmosDB""" - connection_name: str = rest_field(name="connectionName", visibility=["create"]) - """Name of connection to CosmosDB. Required.""" - database_name: str = rest_field(name="databaseName", visibility=["create"]) - """Name of the CosmosDB Database. Required.""" - container_name: str = rest_field(name="containerName", visibility=["create"]) - """Name of CosmosDB Container. Required.""" - embedding_configuration: "_models.EmbeddingConfiguration" = rest_field( - name="embeddingConfiguration", visibility=["create"] + id: str = rest_field(visibility=["read"]) + """Identifier of the schedule run. Required.""" + schedule_id: str = rest_field(name="scheduleId", visibility=["read", "create", "update", "delete", "query"]) + """Identifier of the schedule. Required.""" + success: bool = rest_field(visibility=["read"]) + """Trigger success status of the schedule run. Required.""" + trigger_time: Optional[str] = rest_field( + name="triggerTime", visibility=["read", "create", "update", "delete", "query"] ) - """Embedding model configuration. Required.""" - field_mapping: "_models.FieldMapping" = rest_field(name="fieldMapping", visibility=["create"]) - """Field mapping configuration. Required.""" + """Trigger time of the schedule run.""" + error: Optional[str] = rest_field(visibility=["read"]) + """Error information for the schedule run.""" + properties: dict[str, str] = rest_field(visibility=["read"]) + """Properties of the schedule run. Required.""" @overload def __init__( self, *, - connection_name: str, - database_name: str, - container_name: str, - embedding_configuration: "_models.EmbeddingConfiguration", - field_mapping: "_models.FieldMapping", - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, + schedule_id: str, + trigger_time: Optional[str] = None, ) -> None: ... @overload @@ -764,22 +13949,30 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = IndexType.COSMOS_DB # type: ignore -class CustomCredential(BaseCredentials, discriminator="CustomKeys"): - """Custom credential definition. +class SharepointAgentTool(Tool, discriminator="sharepoint_grounding_preview"): + """The input definition information for a sharepoint tool as used to configure an agent. - :ivar type: The credential type. Required. Custom credential - :vartype type: str or ~azure.ai.projects.models.CUSTOM + :ivar type: The object type, which is always 'sharepoint_grounding'. Required. + :vartype type: str or ~azure.ai.projects.models.SHAREPOINT_GROUNDING_PREVIEW + :ivar sharepoint_grounding_preview: The sharepoint grounding tool parameters. Required. + :vartype sharepoint_grounding_preview: + ~azure.ai.projects.models.SharepointGroundingToolParameters """ - type: Literal[CredentialType.CUSTOM] = rest_discriminator(name="type", visibility=["read"]) # type: ignore - """The credential type. Required. Custom credential""" + type: Literal[ToolType.SHAREPOINT_GROUNDING_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The object type, which is always 'sharepoint_grounding'. Required.""" + sharepoint_grounding_preview: "_models.SharepointGroundingToolParameters" = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The sharepoint grounding tool parameters. Required.""" @overload def __init__( self, + *, + sharepoint_grounding_preview: "_models.SharepointGroundingToolParameters", ) -> None: ... @overload @@ -791,26 +13984,29 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = CredentialType.CUSTOM # type: ignore + self.type = ToolType.SHAREPOINT_GROUNDING_PREVIEW # type: ignore -class DatasetCredential(_Model): - """Represents a reference to a blob for consumption. +class SharepointGroundingToolParameters(_Model): + """The sharepoint grounding tool parameters. - :ivar blob_reference: Credential info to access the storage account. Required. - :vartype blob_reference: ~azure.ai.projects.models.BlobReference + :ivar project_connections: The project connections attached to this tool. There can be a + maximum of 1 connection + resource attached to the tool. + :vartype project_connections: list[~azure.ai.projects.models.ToolProjectConnection] """ - blob_reference: "_models.BlobReference" = rest_field( - name="blobReference", visibility=["read", "create", "update", "delete", "query"] + project_connections: Optional[list["_models.ToolProjectConnection"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] ) - """Credential info to access the storage account. Required.""" + """The project connections attached to this tool. There can be a maximum of 1 connection + resource attached to the tool.""" @overload def __init__( self, *, - blob_reference: "_models.BlobReference", + project_connections: Optional[list["_models.ToolProjectConnection"]] = None, ) -> None: ... @overload @@ -824,66 +14020,188 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class DatasetVersion(_Model): - """DatasetVersion Definition. +class StructuredInputDefinition(_Model): + """An structured input that can participate in prompt template substitutions and tool argument + binding. - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - FileDatasetVersion, FolderDatasetVersion + :ivar description: A human-readable description of the input. + :vartype description: str + :ivar default_value: The default value for the input if no run-time value is provided. + :vartype default_value: any + :ivar tool_argument_bindings: When provided, the input value is bound to the specified tool + arguments. + :vartype tool_argument_bindings: list[~azure.ai.projects.models.ToolArgumentBinding] + :ivar schema: The JSON schema for the structured input (optional). + :vartype schema: any + :ivar required: Whether the input property is required when the agent is invoked. + :vartype required: bool + """ - :ivar data_uri: URI of the data. Example: ``https://go.microsoft.com/fwlink/?linkid=2202330``. Required. - :vartype data_uri: str - :ivar type: Dataset type. Required. Known values are: "uri_file" and "uri_folder". - :vartype type: str or ~azure.ai.projects.models.DatasetType - :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset - manages storage itself. If true, the underlying data will not be deleted when the dataset - version is deleted. - :vartype is_reference: bool - :ivar connection_name: The Azure Storage Account connection name. Required if - startPendingUploadVersion was not called before creating the Dataset. - :vartype connection_name: str - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A human-readable description of the input.""" + default_value: Optional[Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The default value for the input if no run-time value is provided.""" + tool_argument_bindings: Optional[list["_models.ToolArgumentBinding"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """When provided, the input value is bound to the specified tool arguments.""" + schema: Optional[Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The JSON schema for the structured input (optional).""" + required: Optional[bool] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether the input property is required when the agent is invoked.""" + + @overload + def __init__( + self, + *, + description: Optional[str] = None, + default_value: Optional[Any] = None, + tool_argument_bindings: Optional[list["_models.ToolArgumentBinding"]] = None, + schema: Optional[Any] = None, + required: Optional[bool] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class StructuredOutputDefinition(_Model): + """A structured output that can be produced by the agent. + + :ivar name: The name of the structured output. Required. :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. + :ivar description: A description of the output to emit. Used by the model to determine when to + emit the output. Required. :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] + :ivar schema: The JSON schema for the structured output. Required. + :vartype schema: dict[str, any] + :ivar strict: Whether to enforce strict validation. Default ``true``. Required. + :vartype strict: bool """ - __mapping__: dict[str, _Model] = {} - data_uri: str = rest_field(name="dataUri", visibility=["read", "create"]) - """URI of the data. Example: ``https://go.microsoft.com/fwlink/?linkid=2202330``. Required.""" - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """Dataset type. Required. Known values are: \"uri_file\" and \"uri_folder\".""" - is_reference: Optional[bool] = rest_field(name="isReference", visibility=["read"]) - """Indicates if the dataset holds a reference to the storage, or the dataset manages storage - itself. If true, the underlying data will not be deleted when the dataset version is deleted.""" - connection_name: Optional[str] = rest_field(name="connectionName", visibility=["read", "create"]) - """The Azure Storage Account connection name. Required if startPendingUploadVersion was not called - before creating the Dataset.""" - id: Optional[str] = rest_field(visibility=["read"]) - """Asset ID, a unique identifier for the asset.""" - name: str = rest_field(visibility=["read"]) - """The name of the resource. Required.""" - version: str = rest_field(visibility=["read"]) - """The version of the resource. Required.""" - description: Optional[str] = rest_field(visibility=["create", "update"]) - """The asset description text.""" - tags: Optional[dict[str, str]] = rest_field(visibility=["create", "update"]) - """Tag dictionary. Tags can be added, removed, and updated.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the structured output. Required.""" + description: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A description of the output to emit. Used by the model to determine when to emit the output. + Required.""" + schema: dict[str, Any] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The JSON schema for the structured output. Required.""" + strict: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Whether to enforce strict validation. Default ``true``. Required.""" + + @overload + def __init__( + self, + *, + name: str, + description: str, + schema: dict[str, Any], + strict: bool, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class StructuredOutputsItemResource(ItemResource, discriminator="structured_outputs"): + """StructuredOutputsItemResource. + + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.STRUCTURED_OUTPUTS + :ivar output: The structured output captured during the response. Required. + :vartype output: any + """ + + type: Literal[ItemType.STRUCTURED_OUTPUTS] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + output: Any = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The structured output captured during the response. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + output: Any, + created_by: Optional["_models.CreatedBy"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type = ItemType.STRUCTURED_OUTPUTS # type: ignore + + +class TaxonomyCategory(_Model): + """Taxonomy category definition. + + :ivar id: Unique identifier of the taxonomy category. Required. + :vartype id: str + :ivar name: Name of the taxonomy category. Required. + :vartype name: str + :ivar description: Description of the taxonomy category. + :vartype description: str + :ivar risk_category: Risk category associated with this taxonomy category. Required. Known + values are: "HateUnfairness", "Violence", "Sexual", and "SelfHarm". + :vartype risk_category: str or ~azure.ai.projects.models.RiskCategory + :ivar sub_categories: List of taxonomy sub categories. Required. + :vartype sub_categories: list[~azure.ai.projects.models.TaxonomySubCategory] + :ivar properties: Additional properties for the taxonomy category. + :vartype properties: dict[str, str] + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique identifier of the taxonomy category. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Name of the taxonomy category. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the taxonomy category.""" + risk_category: Union[str, "_models.RiskCategory"] = rest_field( + name="riskCategory", visibility=["read", "create", "update", "delete", "query"] + ) + """Risk category associated with this taxonomy category. Required. Known values are: + \"HateUnfairness\", \"Violence\", \"Sexual\", and \"SelfHarm\".""" + sub_categories: list["_models.TaxonomySubCategory"] = rest_field( + name="subCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of taxonomy sub categories. Required.""" + properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Additional properties for the taxonomy category.""" @overload def __init__( self, *, - data_uri: str, - type: str, - connection_name: Optional[str] = None, + id: str, # pylint: disable=redefined-builtin + name: str, + risk_category: Union[str, "_models.RiskCategory"], + sub_categories: list["_models.TaxonomySubCategory"], description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, + properties: Optional[dict[str, str]] = None, ) -> None: ... @overload @@ -897,29 +14215,41 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class Deployment(_Model): - """Model Deployment Definition. - - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - ModelDeployment +class TaxonomySubCategory(_Model): + """Taxonomy sub-category definition. - :ivar type: The type of the deployment. Required. "ModelDeployment" - :vartype type: str or ~azure.ai.projects.models.DeploymentType - :ivar name: Name of the deployment. Required. + :ivar id: Unique identifier of the taxonomy sub-category. Required. + :vartype id: str + :ivar name: Name of the taxonomy sub-category. Required. :vartype name: str + :ivar description: Description of the taxonomy sub-category. + :vartype description: str + :ivar enabled: List of taxonomy items under this sub-category. Required. + :vartype enabled: bool + :ivar properties: Additional properties for the taxonomy sub-category. + :vartype properties: dict[str, str] """ - __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """The type of the deployment. Required. \"ModelDeployment\"""" - name: str = rest_field(visibility=["read"]) - """Name of the deployment. Required.""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Unique identifier of the taxonomy sub-category. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Name of the taxonomy sub-category. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the taxonomy sub-category.""" + enabled: bool = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """List of taxonomy items under this sub-category. Required.""" + properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Additional properties for the taxonomy sub-category.""" @overload def __init__( self, *, - type: str, + id: str, # pylint: disable=redefined-builtin + name: str, + enabled: bool, + description: Optional[str] = None, + properties: Optional[dict[str, str]] = None, ) -> None: ... @overload @@ -933,26 +14263,28 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class DeveloperMessage(Message, discriminator="developer"): - """A message authored by a developer to guide the model during evaluation. +class ToolArgumentBinding(_Model): + """ToolArgumentBinding. - :ivar role: Indicates this is a developer message. Required. Default value is "developer". - :vartype role: str - :ivar content: Content provided by a developer to guide model behavior in an evaluation - context. Required. - :vartype content: str + :ivar tool_name: The name of the tool to participate in the argument binding. If not provided, + then all tools with matching arguments will participate in binding. + :vartype tool_name: str + :ivar argument_name: The name of the argument within the tool. Required. + :vartype argument_name: str """ - role: Literal["developer"] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Indicates this is a developer message. Required. Default value is \"developer\".""" - content: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Content provided by a developer to guide model behavior in an evaluation context. Required.""" + tool_name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool to participate in the argument binding. If not provided, then all tools + with matching arguments will participate in binding.""" + argument_name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the argument within the tool. Required.""" @overload def __init__( self, *, - content: str, + argument_name: str, + tool_name: Optional[str] = None, ) -> None: ... @overload @@ -964,31 +14296,31 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.role = "developer" # type: ignore -class EmbeddingConfiguration(_Model): - """Embedding configuration class. +class ToolChoiceObject(_Model): + """ToolChoiceObject. - :ivar model_deployment_name: Deployment name of embedding model. It can point to a model - deployment either in the parent AIServices or a connection. Required. - :vartype model_deployment_name: str - :ivar embedding_field: Embedding field. Required. - :vartype embedding_field: str + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ToolChoiceObjectCodeInterpreter, ToolChoiceObjectComputer, ToolChoiceObjectFileSearch, + ToolChoiceObjectFunction, ToolChoiceObjectImageGen, ToolChoiceObjectMCP, + ToolChoiceObjectWebSearch + + :ivar type: Required. Known values are: "file_search", "function", "computer_use_preview", + "web_search_preview", "image_generation", "code_interpreter", and "mcp". + :vartype type: str or ~azure.ai.projects.models.ToolChoiceObjectType """ - model_deployment_name: str = rest_field(name="modelDeploymentName", visibility=["create"]) - """Deployment name of embedding model. It can point to a model deployment either in the parent - AIServices or a connection. Required.""" - embedding_field: str = rest_field(name="embeddingField", visibility=["create"]) - """Embedding field. Required.""" + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"file_search\", \"function\", \"computer_use_preview\", + \"web_search_preview\", \"image_generation\", \"code_interpreter\", and \"mcp\".""" @overload def __init__( self, *, - model_deployment_name: str, - embedding_field: str, + type: str, ) -> None: ... @overload @@ -1002,15 +14334,15 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class EntraIDCredentials(BaseCredentials, discriminator="AAD"): - """Entra ID credential definition. +class ToolChoiceObjectCodeInterpreter(ToolChoiceObject, discriminator="code_interpreter"): + """ToolChoiceObjectCodeInterpreter. - :ivar type: The credential type. Required. Entra ID credential (formerly known as AAD) - :vartype type: str or ~azure.ai.projects.models.ENTRA_ID + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.CODE_INTERPRETER """ - type: Literal[CredentialType.ENTRA_ID] = rest_discriminator(name="type", visibility=["read"]) # type: ignore - """The credential type. Required. Entra ID credential (formerly known as AAD)""" + type: Literal[ToolChoiceObjectType.CODE_INTERPRETER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" @overload def __init__( @@ -1026,74 +14358,22 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = CredentialType.ENTRA_ID # type: ignore + self.type = ToolChoiceObjectType.CODE_INTERPRETER # type: ignore -class Evaluation(_Model): - """Evaluation Definition. +class ToolChoiceObjectComputer(ToolChoiceObject, discriminator="computer_use_preview"): + """ToolChoiceObjectComputer. - :ivar name: Identifier of the evaluation. Required. - :vartype name: str - :ivar data: Data for evaluation. Required. - :vartype data: ~azure.ai.projects.models.InputData - :ivar display_name: Display Name for evaluation. It helps to find the evaluation easily in AI - Foundry. It does not need to be unique. - :vartype display_name: str - :ivar description: Description of the evaluation. It can be used to store additional - information about the evaluation and is mutable. - :vartype description: str - :ivar status: Status of the evaluation. It is set by service and is read-only. - :vartype status: str - :ivar tags: Evaluation's tags. Unlike properties, tags are fully mutable. - :vartype tags: dict[str, str] - :ivar properties: Evaluation's properties. Unlike tags, properties are add-only. Once added, a - property cannot be removed. - :vartype properties: dict[str, str] - :ivar evaluators: Evaluators to be used for the evaluation. Required. - :vartype evaluators: dict[str, ~azure.ai.projects.models.EvaluatorConfiguration] - :ivar target: Specifies the type and configuration of the entity used for this evaluation. - :vartype target: ~azure.ai.projects.models.EvaluationTarget + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.COMPUTER """ - name: str = rest_field(name="id", visibility=["read"]) - """Identifier of the evaluation. Required.""" - data: "_models.InputData" = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Data for evaluation. Required.""" - display_name: Optional[str] = rest_field( - name="displayName", visibility=["read", "create", "update", "delete", "query"] - ) - """Display Name for evaluation. It helps to find the evaluation easily in AI Foundry. It does not - need to be unique.""" - description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Description of the evaluation. It can be used to store additional information about the - evaluation and is mutable.""" - status: Optional[str] = rest_field(visibility=["read"]) - """Status of the evaluation. It is set by service and is read-only.""" - tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Evaluation's tags. Unlike properties, tags are fully mutable.""" - properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Evaluation's properties. Unlike tags, properties are add-only. Once added, a property cannot be - removed.""" - evaluators: dict[str, "_models.EvaluatorConfiguration"] = rest_field( - visibility=["read", "create", "update", "delete", "query"] - ) - """Evaluators to be used for the evaluation. Required.""" - target: Optional["_models.EvaluationTarget"] = rest_field( - visibility=["read", "create", "update", "delete", "query"] - ) - """Specifies the type and configuration of the entity used for this evaluation.""" + type: Literal[ToolChoiceObjectType.COMPUTER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" @overload def __init__( self, - *, - data: "_models.InputData", - evaluators: dict[str, "_models.EvaluatorConfiguration"], - display_name: Optional[str] = None, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, - properties: Optional[dict[str, str]] = None, - target: Optional["_models.EvaluationTarget"] = None, ) -> None: ... @overload @@ -1105,29 +14385,22 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolChoiceObjectType.COMPUTER # type: ignore -class EvaluationTarget(_Model): - """Abstract base model for defining evaluation targets. - - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - ModelResponseGenerationTarget +class ToolChoiceObjectFileSearch(ToolChoiceObject, discriminator="file_search"): + """ToolChoiceObjectFileSearch. - :ivar type: Discriminator that defines the type of the evaluation target. Required. - "modelResponseGeneration" - :vartype type: str or ~azure.ai.projects.models.EvaluationTargetType + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.FILE_SEARCH """ - __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """Discriminator that defines the type of the evaluation target. Required. - \"modelResponseGeneration\"""" + type: Literal[ToolChoiceObjectType.FILE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" @overload def __init__( self, - *, - type: str, ) -> None: ... @overload @@ -1139,37 +14412,28 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolChoiceObjectType.FILE_SEARCH # type: ignore -class EvaluatorConfiguration(_Model): - """Evaluator Configuration. +class ToolChoiceObjectFunction(ToolChoiceObject, discriminator="function"): + """Use this option to force the model to call a specific function. - :ivar id: Identifier of the evaluator. Required. - :vartype id: str - :ivar init_params: Initialization parameters of the evaluator. - :vartype init_params: dict[str, any] - :ivar data_mapping: Data parameters of the evaluator. - :vartype data_mapping: dict[str, str] + :ivar type: For function calling, the type is always ``function``. Required. + :vartype type: str or ~azure.ai.projects.models.FUNCTION + :ivar name: The name of the function to call. Required. + :vartype name: str """ - id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Identifier of the evaluator. Required.""" - init_params: Optional[dict[str, Any]] = rest_field( - name="initParams", visibility=["read", "create", "update", "delete", "query"] - ) - """Initialization parameters of the evaluator.""" - data_mapping: Optional[dict[str, str]] = rest_field( - name="dataMapping", visibility=["read", "create", "update", "delete", "query"] - ) - """Data parameters of the evaluator.""" + type: Literal[ToolChoiceObjectType.FUNCTION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """For function calling, the type is always ``function``. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the function to call. Required.""" @overload def __init__( self, *, - id: str, # pylint: disable=redefined-builtin - init_params: Optional[dict[str, Any]] = None, - data_mapping: Optional[dict[str, str]] = None, + name: str, ) -> None: ... @overload @@ -1181,48 +14445,22 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolChoiceObjectType.FUNCTION # type: ignore -class FieldMapping(_Model): - """Field mapping configuration class. +class ToolChoiceObjectImageGen(ToolChoiceObject, discriminator="image_generation"): + """ToolChoiceObjectImageGen. - :ivar content_fields: List of fields with text content. Required. - :vartype content_fields: list[str] - :ivar filepath_field: Path of file to be used as a source of text content. - :vartype filepath_field: str - :ivar title_field: Field containing the title of the document. - :vartype title_field: str - :ivar url_field: Field containing the url of the document. - :vartype url_field: str - :ivar vector_fields: List of fields with vector content. - :vartype vector_fields: list[str] - :ivar metadata_fields: List of fields with metadata content. - :vartype metadata_fields: list[str] + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.IMAGE_GENERATION """ - content_fields: list[str] = rest_field(name="contentFields", visibility=["create"]) - """List of fields with text content. Required.""" - filepath_field: Optional[str] = rest_field(name="filepathField", visibility=["create"]) - """Path of file to be used as a source of text content.""" - title_field: Optional[str] = rest_field(name="titleField", visibility=["create"]) - """Field containing the title of the document.""" - url_field: Optional[str] = rest_field(name="urlField", visibility=["create"]) - """Field containing the url of the document.""" - vector_fields: Optional[list[str]] = rest_field(name="vectorFields", visibility=["create"]) - """List of fields with vector content.""" - metadata_fields: Optional[list[str]] = rest_field(name="metadataFields", visibility=["create"]) - """List of fields with metadata content.""" + type: Literal[ToolChoiceObjectType.IMAGE_GENERATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" @overload def __init__( self, - *, - content_fields: list[str], - filepath_field: Optional[str] = None, - title_field: Optional[str] = None, - url_field: Optional[str] = None, - vector_fields: Optional[list[str]] = None, - metadata_fields: Optional[list[str]] = None, ) -> None: ... @overload @@ -1234,45 +14472,33 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolChoiceObjectType.IMAGE_GENERATION # type: ignore -class FileDatasetVersion(DatasetVersion, discriminator="uri_file"): - """FileDatasetVersion Definition. +class ToolChoiceObjectMCP(ToolChoiceObject, discriminator="mcp"): + """Use this option to force the model to call a specific tool on a remote MCP server. - :ivar data_uri: URI of the data. Example: ``https://go.microsoft.com/fwlink/?linkid=2202330``. Required. - :vartype data_uri: str - :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset - manages storage itself. If true, the underlying data will not be deleted when the dataset - version is deleted. - :vartype is_reference: bool - :ivar connection_name: The Azure Storage Account connection name. Required if - startPendingUploadVersion was not called before creating the Dataset. - :vartype connection_name: str - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. + :ivar type: For MCP tools, the type is always ``mcp``. Required. + :vartype type: str or ~azure.ai.projects.models.MCP + :ivar server_label: The label of the MCP server to use. Required. + :vartype server_label: str + :ivar name: The name of the tool to call on the server. :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - :ivar type: Dataset type. Required. URI file. - :vartype type: str or ~azure.ai.projects.models.URI_FILE """ - type: Literal[DatasetType.URI_FILE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Dataset type. Required. URI file.""" + type: Literal[ToolChoiceObjectType.MCP] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """For MCP tools, the type is always ``mcp``. Required.""" + server_label: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The label of the MCP server to use. Required.""" + name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool to call on the server.""" @overload def __init__( self, *, - data_uri: str, - connection_name: Optional[str] = None, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, + server_label: str, + name: Optional[str] = None, ) -> None: ... @overload @@ -1284,46 +14510,22 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = DatasetType.URI_FILE # type: ignore + self.type = ToolChoiceObjectType.MCP # type: ignore -class FolderDatasetVersion(DatasetVersion, discriminator="uri_folder"): - """FileDatasetVersion Definition. +class ToolChoiceObjectWebSearch(ToolChoiceObject, discriminator="web_search_preview"): + """Note: web_search is not yet available via Azure OpenAI. - :ivar data_uri: URI of the data. Example: ``https://go.microsoft.com/fwlink/?linkid=2202330``. Required. - :vartype data_uri: str - :ivar is_reference: Indicates if the dataset holds a reference to the storage, or the dataset - manages storage itself. If true, the underlying data will not be deleted when the dataset - version is deleted. - :vartype is_reference: bool - :ivar connection_name: The Azure Storage Account connection name. Required if - startPendingUploadVersion was not called before creating the Dataset. - :vartype connection_name: str - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - :ivar type: Dataset type. Required. URI folder. - :vartype type: str or ~azure.ai.projects.models.URI_FOLDER + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.WEB_SEARCH """ - type: Literal[DatasetType.URI_FOLDER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Dataset type. Required. URI folder.""" + type: Literal[ToolChoiceObjectType.WEB_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" @overload def __init__( self, - *, - data_uri: str, - connection_name: Optional[str] = None, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, ) -> None: ... @overload @@ -1335,28 +14537,29 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = DatasetType.URI_FOLDER # type: ignore - + self.type = ToolChoiceObjectType.WEB_SEARCH # type: ignore -class InputData(_Model): - """Abstract data class. - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - InputDataset +class ToolDescription(_Model): + """Description of a tool that can be used by an agent. - :ivar type: Type of the data. Required. Default value is None. - :vartype type: str + :ivar name: The name of the tool. + :vartype name: str + :ivar description: A brief description of the tool's purpose. + :vartype description: str """ - __mapping__: dict[str, _Model] = {} - type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) - """Type of the data. Required. Default value is None.""" + name: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The name of the tool.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A brief description of the tool's purpose.""" @overload def __init__( self, *, - type: str, + name: Optional[str] = None, + description: Optional[str] = None, ) -> None: ... @overload @@ -1370,25 +14573,22 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class InputDataset(InputData, discriminator="dataset"): - """Dataset as source for evaluation. +class ToolProjectConnection(_Model): + """A project connection resource. - :ivar type: Required. Default value is "dataset". - :vartype type: str - :ivar id: Evaluation input data. Required. - :vartype id: str + :ivar project_connection_id: A project connection in a ToolProjectConnectionList attached to + this tool. Required. + :vartype project_connection_id: str """ - type: Literal["dataset"] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Required. Default value is \"dataset\".""" - id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Evaluation input data. Required.""" + project_connection_id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """A project connection in a ToolProjectConnectionList attached to this tool. Required.""" @overload def __init__( self, *, - id: str, # pylint: disable=redefined-builtin + project_connection_id: str, ) -> None: ... @overload @@ -1400,40 +14600,67 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = "dataset" # type: ignore -class ManagedAzureAISearchIndex(Index, discriminator="ManagedAzureSearch"): - """Managed Azure AI Search Index Definition. +class ToolProjectConnectionList(_Model): + """A set of project connection resources currently used by either the ``bing_grounding``, + ``fabric_dataagent``, or ``sharepoint_grounding`` tools. - :ivar id: Asset ID, a unique identifier for the asset. - :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - :ivar type: Type of index. Required. Managed Azure Search - :vartype type: str or ~azure.ai.projects.models.MANAGED_AZURE_SEARCH - :ivar vector_store_id: Vector store id of managed index. Required. - :vartype vector_store_id: str + :ivar project_connections: The project connections attached to this tool. There can be a + maximum of 1 connection + resource attached to the tool. + :vartype project_connections: list[~azure.ai.projects.models.ToolProjectConnection] + """ + + project_connections: Optional[list["_models.ToolProjectConnection"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The project connections attached to this tool. There can be a maximum of 1 connection + resource attached to the tool.""" + + @overload + def __init__( + self, + *, + project_connections: Optional[list["_models.ToolProjectConnection"]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class TopLogProb(_Model): + """The top log probability of a token. + + :ivar token: Required. + :vartype token: str + :ivar logprob: Required. + :vartype logprob: float + :ivar bytes: Required. + :vartype bytes: list[int] """ - type: Literal[IndexType.MANAGED_AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Type of index. Required. Managed Azure Search""" - vector_store_id: str = rest_field(name="vectorStoreId", visibility=["create"]) - """Vector store id of managed index. Required.""" + token: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + logprob: float = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" + bytes: list[int] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Required.""" @overload def __init__( self, *, - vector_store_id: str, - description: Optional[str] = None, - tags: Optional[dict[str, str]] = None, + token: str, + logprob: float, + bytes: list[int], ) -> None: ... @overload @@ -1445,48 +14672,37 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = IndexType.MANAGED_AZURE_SEARCH # type: ignore -class ModelDeployment(Deployment, discriminator="ModelDeployment"): - """Model Deployment Definition. +class UserProfileMemoryItem(MemoryItem, discriminator="user_profile"): + """A memory item specifically containing user profile information extracted from conversations, + such as preferences, interests, and personal details. - :ivar name: Name of the deployment. Required. - :vartype name: str - :ivar type: The type of the deployment. Required. Model deployment - :vartype type: str or ~azure.ai.projects.models.MODEL_DEPLOYMENT - :ivar model_name: Publisher-specific name of the deployed model. Required. - :vartype model_name: str - :ivar model_version: Publisher-specific version of the deployed model. Required. - :vartype model_version: str - :ivar model_publisher: Name of the deployed model's publisher. Required. - :vartype model_publisher: str - :ivar capabilities: Capabilities of deployed model. Required. - :vartype capabilities: dict[str, str] - :ivar sku: Sku of the model deployment. Required. - :vartype sku: ~azure.ai.projects.models.ModelDeploymentSku - :ivar connection_name: Name of the connection the deployment comes from. - :vartype connection_name: str + :ivar memory_id: The unique ID of the memory item. Required. + :vartype memory_id: str + :ivar updated_at: The last update time of the memory item. Required. + :vartype updated_at: ~datetime.datetime + :ivar scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :vartype scope: str + :ivar content: The content of the memory. Required. + :vartype content: str + :ivar kind: The kind of the memory item. Required. User profile information extracted from + conversations. + :vartype kind: str or ~azure.ai.projects.models.USER_PROFILE """ - type: Literal[DeploymentType.MODEL_DEPLOYMENT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """The type of the deployment. Required. Model deployment""" - model_name: str = rest_field(name="modelName", visibility=["read"]) - """Publisher-specific name of the deployed model. Required.""" - model_version: str = rest_field(name="modelVersion", visibility=["read"]) - """Publisher-specific version of the deployed model. Required.""" - model_publisher: str = rest_field(name="modelPublisher", visibility=["read"]) - """Name of the deployed model's publisher. Required.""" - capabilities: dict[str, str] = rest_field(visibility=["read"]) - """Capabilities of deployed model. Required.""" - sku: "_models.ModelDeploymentSku" = rest_field(visibility=["read"]) - """Sku of the model deployment. Required.""" - connection_name: Optional[str] = rest_field(name="connectionName", visibility=["read"]) - """Name of the connection the deployment comes from.""" + kind: Literal[MemoryItemKind.USER_PROFILE] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The kind of the memory item. Required. User profile information extracted from conversations.""" @overload def __init__( self, + *, + memory_id: str, + updated_at: datetime.datetime, + scope: str, + content: str, ) -> None: ... @overload @@ -1498,44 +14714,38 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = DeploymentType.MODEL_DEPLOYMENT # type: ignore + self.kind = MemoryItemKind.USER_PROFILE # type: ignore -class ModelDeploymentSku(_Model): - """Sku information. +class VectorStoreFileAttributes(_Model): + """Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. Keys are strings + with a maximum length of 64 characters. Values are strings with a maximum + length of 512 characters, booleans, or numbers. - :ivar capacity: Sku capacity. Required. - :vartype capacity: int - :ivar family: Sku family. Required. - :vartype family: str - :ivar name: Sku name. Required. - :vartype name: str - :ivar size: Sku size. Required. - :vartype size: str - :ivar tier: Sku tier. Required. - :vartype tier: str """ - capacity: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Sku capacity. Required.""" - family: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Sku family. Required.""" - name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Sku name. Required.""" - size: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Sku size. Required.""" - tier: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Sku tier. Required.""" + +class WebSearchAction(_Model): + """WebSearchAction. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + WebSearchActionFind, WebSearchActionOpenPage, WebSearchActionSearch + + :ivar type: Required. Known values are: "search", "open_page", and "find". + :vartype type: str or ~azure.ai.projects.models.WebSearchActionType + """ + + __mapping__: dict[str, _Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Required. Known values are: \"search\", \"open_page\", and \"find\".""" @overload def __init__( self, *, - capacity: int, - family: str, - name: str, - size: str, - tier: str, + type: str, ) -> None: ... @overload @@ -1549,46 +14759,30 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class ModelResponseGenerationTarget(EvaluationTarget, discriminator="modelResponseGeneration"): - """Evaluation target for generating responses using a given model and dataset. +class WebSearchActionFind(WebSearchAction, discriminator="find"): + """Action type "find": Searches for a pattern within a loaded page. - :ivar type: The type of evaluation target. Always 'modelResponseGeneration'. Required. - Evaluation target that uses a model for response generation. - :vartype type: str or ~azure.ai.projects.models.MODEL_RESPONSE_GENERATION - :ivar base_messages: A list of messages comprising the conversation so far. Required. - :vartype base_messages: list[~azure.ai.projects.models.Message] - :ivar model_deployment_name: The model deployment to be evaluated. Accepts either the - deployment name alone or with the connection name as '{connectionName}/modelDeploymentName'. - Required. - :vartype model_deployment_name: str - :ivar model_params: Optional parameters passed to the model for evaluation. Required. - :vartype model_params: dict[str, any] + :ivar type: The action type. Required. + :vartype type: str or ~azure.ai.projects.models.FIND + :ivar url: The URL of the page searched for the pattern. Required. + :vartype url: str + :ivar pattern: The pattern or text to search for within the page. Required. + :vartype pattern: str """ - type: Literal[EvaluationTargetType.MODEL_RESPONSE_GENERATION] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """The type of evaluation target. Always 'modelResponseGeneration'. Required. Evaluation target - that uses a model for response generation.""" - base_messages: list["_models.Message"] = rest_field( - name="baseMessages", visibility=["read", "create", "update", "delete", "query"] - ) - """A list of messages comprising the conversation so far. Required.""" - model_deployment_name: str = rest_field( - name="modelDeploymentName", visibility=["read", "create", "update", "delete", "query"] - ) - """The model deployment to be evaluated. Accepts either the deployment name alone or with the - connection name as '{connectionName}/modelDeploymentName'. Required.""" - model_params: dict[str, Any] = rest_field( - name="modelParams", visibility=["read", "create", "update", "delete", "query"] - ) - """Optional parameters passed to the model for evaluation. Required.""" + type: Literal[WebSearchActionType.FIND] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The action type. Required.""" + url: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL of the page searched for the pattern. Required.""" + pattern: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The pattern or text to search for within the page. Required.""" @overload def __init__( self, *, - base_messages: list["_models.Message"], - model_deployment_name: str, - model_params: dict[str, Any], + url: str, + pattern: str, ) -> None: ... @overload @@ -1600,22 +14794,28 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = EvaluationTargetType.MODEL_RESPONSE_GENERATION # type: ignore + self.type = WebSearchActionType.FIND # type: ignore -class NoAuthenticationCredentials(BaseCredentials, discriminator="None"): - """Credentials that do not require authentication. +class WebSearchActionOpenPage(WebSearchAction, discriminator="open_page"): + """Action type "open_page" - Opens a specific URL from search results. - :ivar type: The credential type. Required. No credential - :vartype type: str or ~azure.ai.projects.models.NONE + :ivar type: The action type. Required. + :vartype type: str or ~azure.ai.projects.models.OPEN_PAGE + :ivar url: The URL opened by the model. Required. + :vartype url: str """ - type: Literal[CredentialType.NONE] = rest_discriminator(name="type", visibility=["read"]) # type: ignore - """The credential type. Required. No credential""" + type: Literal[WebSearchActionType.OPEN_PAGE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The action type. Required.""" + url: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The URL opened by the model. Required.""" @overload def __init__( self, + *, + url: str, ) -> None: ... @overload @@ -1627,42 +14827,28 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = CredentialType.NONE # type: ignore + self.type = WebSearchActionType.OPEN_PAGE # type: ignore -class PendingUploadRequest(_Model): - """Represents a request for a pending upload. +class WebSearchActionSearch(WebSearchAction, discriminator="search"): + """Action type "search" - Performs a web search query. - :ivar pending_upload_id: If PendingUploadId is not provided, a random GUID will be used. - :vartype pending_upload_id: str - :ivar connection_name: Azure Storage Account connection name to use for generating temporary - SAS token. - :vartype connection_name: str - :ivar pending_upload_type: BlobReference is the only supported type. Required. Blob Reference - is the only supported type. - :vartype pending_upload_type: str or ~azure.ai.projects.models.BLOB_REFERENCE + :ivar type: The action type. Required. + :vartype type: str or ~azure.ai.projects.models.SEARCH + :ivar query: The search query. Required. + :vartype query: str """ - pending_upload_id: Optional[str] = rest_field( - name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] - ) - """If PendingUploadId is not provided, a random GUID will be used.""" - connection_name: Optional[str] = rest_field( - name="connectionName", visibility=["read", "create", "update", "delete", "query"] - ) - """Azure Storage Account connection name to use for generating temporary SAS token.""" - pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE] = rest_field( - name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] - ) - """BlobReference is the only supported type. Required. Blob Reference is the only supported type.""" + type: Literal[WebSearchActionType.SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The action type. Required.""" + query: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The search query. Required.""" @overload def __init__( self, *, - pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE], - pending_upload_id: Optional[str] = None, - connection_name: Optional[str] = None, + query: str, ) -> None: ... @overload @@ -1674,46 +14860,41 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = WebSearchActionType.SEARCH # type: ignore -class PendingUploadResponse(_Model): - """Represents the response for a pending upload request. +class WebSearchPreviewTool(Tool, discriminator="web_search_preview"): + """Note: web_search is not yet available via Azure OpenAI. - :ivar blob_reference: Container-level read, write, list SAS. Required. - :vartype blob_reference: ~azure.ai.projects.models.BlobReference - :ivar pending_upload_id: ID for this upload request. Required. - :vartype pending_upload_id: str - :ivar version: Version of asset to be created if user did not specify version when initially - creating upload. - :vartype version: str - :ivar pending_upload_type: BlobReference is the only supported type. Required. Blob Reference - is the only supported type. - :vartype pending_upload_type: str or ~azure.ai.projects.models.BLOB_REFERENCE + :ivar type: The type of the web search tool. One of ``web_search_preview`` or + ``web_search_preview_2025_03_11``. Required. + :vartype type: str or ~azure.ai.projects.models.WEB_SEARCH_PREVIEW + :ivar user_location: The user's location. + :vartype user_location: ~azure.ai.projects.models.Location + :ivar search_context_size: High level guidance for the amount of context window space to use + for the search. One of ``low``, ``medium``, or ``high``. ``medium`` is the default. Is one of + the following types: Literal["low"], Literal["medium"], Literal["high"] + :vartype search_context_size: str or str or str """ - blob_reference: "_models.BlobReference" = rest_field( - name="blobReference", visibility=["read", "create", "update", "delete", "query"] - ) - """Container-level read, write, list SAS. Required.""" - pending_upload_id: str = rest_field( - name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] - ) - """ID for this upload request. Required.""" - version: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Version of asset to be created if user did not specify version when initially creating upload.""" - pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE] = rest_field( - name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] + type: Literal[ToolType.WEB_SEARCH_PREVIEW] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the web search tool. One of ``web_search_preview`` or + ``web_search_preview_2025_03_11``. Required.""" + user_location: Optional["_models.Location"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The user's location.""" + search_context_size: Optional[Literal["low", "medium", "high"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] ) - """BlobReference is the only supported type. Required. Blob Reference is the only supported type.""" + """High level guidance for the amount of context window space to use for the search. One of + ``low``, ``medium``, or ``high``. ``medium`` is the default. Is one of the following types: + Literal[\"low\"], Literal[\"medium\"], Literal[\"high\"]""" @overload def __init__( self, *, - blob_reference: "_models.BlobReference", - pending_upload_id: str, - pending_upload_type: Literal[PendingUploadType.BLOB_REFERENCE], - version: Optional[str] = None, + user_location: Optional["_models.Location"] = None, + search_context_size: Optional[Literal["low", "medium", "high"]] = None, ) -> None: ... @overload @@ -1725,86 +14906,31 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ToolType.WEB_SEARCH_PREVIEW # type: ignore -class RedTeam(_Model): - """Red team details. +class WebSearchToolCallItemParam(ItemParam, discriminator="web_search_call"): + """The results of a web search tool call. See the + `web search guide `_ for more information. - :ivar name: Identifier of the red team run. Required. - :vartype name: str - :ivar display_name: Name of the red-team run. - :vartype display_name: str - :ivar num_turns: Number of simulation rounds. - :vartype num_turns: int - :ivar attack_strategies: List of attack strategies or nested lists of attack strategies. - :vartype attack_strategies: list[str or ~azure.ai.projects.models.AttackStrategy] - :ivar simulation_only: Simulation-only or Simulation + Evaluation. Default false, if true the - scan outputs conversation not evaluation result. - :vartype simulation_only: bool - :ivar risk_categories: List of risk categories to generate attack objectives for. - :vartype risk_categories: list[str or ~azure.ai.projects.models.RiskCategory] - :ivar application_scenario: Application scenario for the red team operation, to generate - scenario specific attacks. - :vartype application_scenario: str - :ivar tags: Red team's tags. Unlike properties, tags are fully mutable. - :vartype tags: dict[str, str] - :ivar properties: Red team's properties. Unlike tags, properties are add-only. Once added, a - property cannot be removed. - :vartype properties: dict[str, str] - :ivar status: Status of the red-team. It is set by service and is read-only. - :vartype status: str - :ivar target: Target configuration for the red-team run. Required. - :vartype target: ~azure.ai.projects.models.TargetConfig + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.WEB_SEARCH_CALL + :ivar action: An object describing the specific action taken in this web search call. + Includes details on how the model used the web (search, open_page, find). Required. + :vartype action: ~azure.ai.projects.models.WebSearchAction """ - name: str = rest_field(name="id", visibility=["read"]) - """Identifier of the red team run. Required.""" - display_name: Optional[str] = rest_field( - name="displayName", visibility=["read", "create", "update", "delete", "query"] - ) - """Name of the red-team run.""" - num_turns: Optional[int] = rest_field(name="numTurns", visibility=["read", "create", "update", "delete", "query"]) - """Number of simulation rounds.""" - attack_strategies: Optional[list[Union[str, "_models.AttackStrategy"]]] = rest_field( - name="attackStrategies", visibility=["read", "create", "update", "delete", "query"] - ) - """List of attack strategies or nested lists of attack strategies.""" - simulation_only: Optional[bool] = rest_field( - name="simulationOnly", visibility=["read", "create", "update", "delete", "query"] - ) - """Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs - conversation not evaluation result.""" - risk_categories: Optional[list[Union[str, "_models.RiskCategory"]]] = rest_field( - name="riskCategories", visibility=["read", "create", "update", "delete", "query"] - ) - """List of risk categories to generate attack objectives for.""" - application_scenario: Optional[str] = rest_field( - name="applicationScenario", visibility=["read", "create", "update", "delete", "query"] - ) - """Application scenario for the red team operation, to generate scenario specific attacks.""" - tags: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Red team's tags. Unlike properties, tags are fully mutable.""" - properties: Optional[dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Red team's properties. Unlike tags, properties are add-only. Once added, a property cannot be - removed.""" - status: Optional[str] = rest_field(visibility=["read"]) - """Status of the red-team. It is set by service and is read-only.""" - target: "_models.TargetConfig" = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Target configuration for the red-team run. Required.""" + type: Literal[ItemType.WEB_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + action: "_models.WebSearchAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An object describing the specific action taken in this web search call. + Includes details on how the model used the web (search, open_page, find). Required.""" @overload def __init__( self, *, - target: "_models.TargetConfig", - display_name: Optional[str] = None, - num_turns: Optional[int] = None, - attack_strategies: Optional[list[Union[str, "_models.AttackStrategy"]]] = None, - simulation_only: Optional[bool] = None, - risk_categories: Optional[list[Union[str, "_models.RiskCategory"]]] = None, - application_scenario: Optional[str] = None, - tags: Optional[dict[str, str]] = None, - properties: Optional[dict[str, str]] = None, + action: "_models.WebSearchAction", ) -> None: ... @overload @@ -1816,25 +14942,46 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) + self.type = ItemType.WEB_SEARCH_CALL # type: ignore -class SASCredentials(BaseCredentials, discriminator="SAS"): - """Shared Access Signature (SAS) credential definition. +class WebSearchToolCallItemResource(ItemResource, discriminator="web_search_call"): + """The results of a web search tool call. See the + `web search guide `_ for more information. - :ivar type: The credential type. Required. Shared Access Signature (SAS) credential - :vartype type: str or ~azure.ai.projects.models.SAS - :ivar sas_token: SAS token. - :vartype sas_token: str + :ivar id: Required. + :vartype id: str + :ivar created_by: The information about the creator of the item. + :vartype created_by: ~azure.ai.projects.models.CreatedBy + :ivar type: Required. + :vartype type: str or ~azure.ai.projects.models.WEB_SEARCH_CALL + :ivar status: The status of the web search tool call. Required. Is one of the following types: + Literal["in_progress"], Literal["searching"], Literal["completed"], Literal["failed"] + :vartype status: str or str or str or str + :ivar action: An object describing the specific action taken in this web search call. + Includes details on how the model used the web (search, open_page, find). Required. + :vartype action: ~azure.ai.projects.models.WebSearchAction """ - type: Literal[CredentialType.SAS] = rest_discriminator(name="type", visibility=["read"]) # type: ignore - """The credential type. Required. Shared Access Signature (SAS) credential""" - sas_token: Optional[str] = rest_field(name="SAS", visibility=["read"]) - """SAS token.""" + type: Literal[ItemType.WEB_SEARCH_CALL] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + status: Literal["in_progress", "searching", "completed", "failed"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """The status of the web search tool call. Required. Is one of the following types: + Literal[\"in_progress\"], Literal[\"searching\"], Literal[\"completed\"], Literal[\"failed\"]""" + action: "_models.WebSearchAction" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """An object describing the specific action taken in this web search call. + Includes details on how the model used the web (search, open_page, find). Required.""" @overload def __init__( self, + *, + id: str, # pylint: disable=redefined-builtin + status: Literal["in_progress", "searching", "completed", "failed"], + action: "_models.WebSearchAction", + created_by: Optional["_models.CreatedBy"] = None, ) -> None: ... @overload @@ -1846,29 +14993,30 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.type = CredentialType.SAS # type: ignore + self.type = ItemType.WEB_SEARCH_CALL # type: ignore -class SystemMessage(Message, discriminator="system"): - """A message authored by the system to guide model behavior. +class WeeklyRecurrenceSchedule(RecurrenceSchedule, discriminator="Weekly"): + """Weekly recurrence schedule. - :ivar role: Indicates this is a system message. Required. Default value is "system". - :vartype role: str - :ivar content: Plain text instructions provided by the system to steer model behavior. - Required. - :vartype content: str + :ivar type: Weekly recurrence type. Required. Weekly recurrence pattern. + :vartype type: str or ~azure.ai.projects.models.WEEKLY + :ivar days_of_week: Days of the week for the recurrence schedule. Required. + :vartype days_of_week: list[str or ~azure.ai.projects.models.DayOfWeek] """ - role: Literal["system"] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Indicates this is a system message. Required. Default value is \"system\".""" - content: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Plain text instructions provided by the system to steer model behavior. Required.""" + type: Literal[RecurrenceType.WEEKLY] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Weekly recurrence type. Required. Weekly recurrence pattern.""" + days_of_week: list[Union[str, "_models.DayOfWeek"]] = rest_field( + name="daysOfWeek", visibility=["read", "create", "update", "delete", "query"] + ) + """Days of the week for the recurrence schedule. Required.""" @overload def __init__( self, *, - content: str, + days_of_week: list[Union[str, "_models.DayOfWeek"]], ) -> None: ... @overload @@ -1880,28 +15028,31 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.role = "system" # type: ignore + self.type = RecurrenceType.WEEKLY # type: ignore -class UserMessage(Message, discriminator="user"): - """A message authored by the end user as input to the model. +class WorkflowDefinition(AgentDefinition, discriminator="workflow"): + """The workflow specification in CSDL format. - :ivar role: Indicates this is a user message. Required. Default value is "user". - :vartype role: str - :ivar content: Input content or question provided by the end user. Required. - :vartype content: str + :ivar rai_config: Configuration for Responsible AI (RAI) content filtering and safety features. + :vartype rai_config: ~azure.ai.projects.models.RaiConfig + :ivar kind: Required. + :vartype kind: str or ~azure.ai.projects.models.WORKFLOW + :ivar workflow: The CSDL YAML definition of the workflow. + :vartype workflow: str """ - role: Literal["user"] = rest_discriminator(name="role", visibility=["read", "create", "update", "delete", "query"]) # type: ignore - """Indicates this is a user message. Required. Default value is \"user\".""" - content: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Input content or question provided by the end user. Required.""" + kind: Literal[AgentKind.WORKFLOW] = rest_discriminator(name="kind", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required.""" + workflow: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The CSDL YAML definition of the workflow.""" @overload def __init__( self, *, - content: str, + rai_config: Optional["_models.RaiConfig"] = None, + workflow: Optional[str] = None, ) -> None: ... @overload @@ -1913,4 +15064,4 @@ def __init__(self, mapping: Mapping[str, Any]) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) - self.role = "user" # type: ignore + self.kind = AgentKind.WORKFLOW # type: ignore diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/operations/__init__.py b/sdk/ai/azure-ai-projects/azure/ai/projects/operations/__init__.py index 3cfd5a29391a..5ae1225f30fa 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/operations/__init__.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/operations/__init__.py @@ -12,24 +12,36 @@ if TYPE_CHECKING: from ._patch import * # pylint: disable=unused-wildcard-import +from ._operations import AgentsOperations # type: ignore +from ._operations import MemoryStoresOperations # type: ignore from ._operations import ConnectionsOperations # type: ignore -from ._operations import EvaluationsOperations # type: ignore from ._operations import DatasetsOperations # type: ignore from ._operations import IndexesOperations # type: ignore from ._operations import DeploymentsOperations # type: ignore from ._operations import RedTeamsOperations # type: ignore +from ._operations import EvaluationRulesOperations # type: ignore +from ._operations import EvaluationTaxonomiesOperations # type: ignore +from ._operations import EvaluatorsOperations # type: ignore +from ._operations import InsightsOperations # type: ignore +from ._operations import SchedulesOperations # type: ignore from ._patch import __all__ as _patch_all from ._patch import * from ._patch import patch_sdk as _patch_sdk __all__ = [ + "AgentsOperations", + "MemoryStoresOperations", "ConnectionsOperations", - "EvaluationsOperations", "DatasetsOperations", "IndexesOperations", "DeploymentsOperations", "RedTeamsOperations", + "EvaluationRulesOperations", + "EvaluationTaxonomiesOperations", + "EvaluatorsOperations", + "InsightsOperations", + "SchedulesOperations", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore _patch_sdk() diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/operations/_operations.py b/sdk/ai/azure-ai-projects/azure/ai/projects/operations/_operations.py index 08c655a081cd..ba48746c1ddb 100644 --- a/sdk/ai/azure-ai-projects/azure/ai/projects/operations/_operations.py +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/operations/_operations.py @@ -1,4 +1,4 @@ -# pylint: disable=too-many-lines +# pylint: disable=line-too-long,useless-suppression,too-many-lines # coding=utf-8 # -------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. @@ -7,10 +7,12 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- from collections.abc import MutableMapping +import datetime from io import IOBase import json -from typing import Any, Callable, IO, Optional, TypeVar, Union, overload +from typing import Any, Callable, IO, Iterator, Literal, Optional, TypeVar, Union, cast, overload import urllib.parse +import uuid from azure.core import PipelineClient from azure.core.exceptions import ( @@ -25,36 +27,39 @@ ) from azure.core.paging import ItemPaged from azure.core.pipeline import PipelineResponse +from azure.core.polling import LROPoller, NoPolling, PollingMethod +from azure.core.polling.base_polling import LROBasePolling from azure.core.rest import HttpRequest, HttpResponse from azure.core.tracing.decorator import distributed_trace from azure.core.utils import case_insensitive_dict from .. import models as _models from .._configuration import AIProjectClientConfiguration -from .._utils.model_base import SdkJSONEncoder, _deserialize +from .._utils.model_base import SdkJSONEncoder, _deserialize, _failsafe_deserialize from .._utils.serialization import Deserializer, Serializer from .._validation import api_version_validation +JSON = MutableMapping[str, Any] +_Unset: Any = object() T = TypeVar("T") ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -JSON = MutableMapping[str, Any] List = list _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False -def build_connections_get_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_retrieve_request(agent_name: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/connections/{name}" + _url = "/agents/{agent_name}" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -68,19 +73,40 @@ def build_connections_get_request(name: str, **kwargs: Any) -> HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_connections_get_with_credentials_request( # pylint: disable=name-too-long - name: str, **kwargs: Any -) -> HttpRequest: +def build_agents_create_request(**kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/connections/{name}/getConnectionWithCredentials" + _url = "/agents" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_agents_update_request(agent_name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/agents/{agent_name}" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -89,50 +115,49 @@ def build_connections_get_with_credentials_request( # pylint: disable=name-too- _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_connections_list_request( - *, - connection_type: Optional[Union[str, _models.ConnectionType]] = None, - default_connection: Optional[bool] = None, - **kwargs: Any -) -> HttpRequest: +def build_agents_create_agent_from_manifest_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/connections" + _url = "/agents:import" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - if connection_type is not None: - _params["connectionType"] = _SERIALIZER.query("connection_type", connection_type, "str") - if default_connection is not None: - _params["defaultConnection"] = _SERIALIZER.query("default_connection", default_connection, "bool") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_get_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_update_agent_from_manifest_request( # pylint: disable=name-too-long + agent_name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluations/runs/{name}" + _url = "/agents/{agent_name}/import" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -141,20 +166,27 @@ def build_evaluations_get_request(name: str, **kwargs: Any) -> HttpRequest: _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_list_request(**kwargs: Any) -> HttpRequest: +def build_agents_delete_request(agent_name: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluations/runs" + _url = "/agents/{agent_name}" + path_format_arguments = { + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") @@ -162,41 +194,61 @@ def build_evaluations_list_request(**kwargs: Any) -> HttpRequest: # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_create_request(**kwargs: Any) -> HttpRequest: +def build_agents_list_request( + *, + kind: Optional[Union[str, _models.AgentKind]] = None, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + after: Optional[str] = None, + before: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluations/runs:run" + _url = "/agents" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if kind is not None: + _params["kind"] = _SERIALIZER.query("kind", kind, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + if order is not None: + _params["order"] = _SERIALIZER.query("order", order, "str") + if after is not None: + _params["after"] = _SERIALIZER.query("after", after, "str") + if before is not None: + _params["before"] = _SERIALIZER.query("before", before, "str") # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_create_agent_evaluation_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long +def build_agents_create_version_request(agent_name: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluations/runs:runAgent" + _url = "/agents/{agent_name}/versions" + path_format_arguments = { + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") @@ -209,15 +261,20 @@ def build_evaluations_create_agent_evaluation_request(**kwargs: Any) -> HttpRequ return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_cancel_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_create_agent_version_from_manifest_request( # pylint: disable=name-too-long + agent_name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + # Construct URL - _url = "/evaluations/runs/{name}:cancel" + _url = "/agents/{agent_name}/versions:import" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -226,19 +283,25 @@ def build_evaluations_cancel_request(name: str, **kwargs: Any) -> HttpRequest: _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluations_delete_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_retrieve_version_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + # Construct URL - _url = "/evaluations/runs/{name}" + _url = "/agents/{agent_name}/versions/{agent_version}" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -247,21 +310,23 @@ def build_evaluations_delete_request(name: str, **kwargs: Any) -> HttpRequest: _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_list_versions_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_delete_version_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets/{name}/versions" + _url = "/agents/{agent_name}/versions/{agent_version}" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -272,21 +337,42 @@ def build_datasets_list_versions_request(name: str, **kwargs: Any) -> HttpReques # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_list_request(**kwargs: Any) -> HttpRequest: +def build_agents_list_versions_request( + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + after: Optional[str] = None, + before: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets" + _url = "/agents/{agent_name}/versions" + path_format_arguments = { + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + if order is not None: + _params["order"] = _SERIALIZER.query("order", order, "str") + if after is not None: + _params["after"] = _SERIALIZER.query("after", after, "str") + if before is not None: + _params["before"] = _SERIALIZER.query("before", before, "str") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -294,18 +380,19 @@ def build_datasets_list_request(**kwargs: Any) -> HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_get_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_start_container_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets/{name}/versions/{version}" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default:start" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -314,20 +401,26 @@ def build_datasets_get_request(name: str, version: str, **kwargs: Any) -> HttpRe _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_delete_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_update_container_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + # Construct URL - _url = "/datasets/{name}/versions/{version}" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default:update" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -335,22 +428,26 @@ def build_datasets_delete_request(name: str, version: str, **kwargs: Any) -> Htt # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - return HttpRequest(method="DELETE", url=_url, params=_params, **kwargs) + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_create_or_update_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_stop_container_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets/{name}/versions/{version}" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default:stop" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -359,26 +456,23 @@ def build_datasets_create_or_update_request(name: str, version: str, **kwargs: A _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_pending_upload_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_delete_container_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets/{name}/versions/{version}/startPendingUpload" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default:delete" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -387,25 +481,23 @@ def build_datasets_pending_upload_request(name: str, version: str, **kwargs: Any _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_get_credentials_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_retrieve_container_request(agent_name: str, agent_version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/datasets/{name}/versions/{version}/credentials" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -416,20 +508,23 @@ def build_datasets_get_credentials_request(name: str, version: str, **kwargs: An # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_list_versions_request(name: str, **kwargs: Any) -> HttpRequest: +def build_agents_retrieve_container_operation_request( # pylint: disable=name-too-long + agent_name: str, operation_id: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/indexes/{name}/versions" + _url = "/agents/{agent_name}/operations/{operation_id}" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "operation_id": _SERIALIZER.url("operation_id", operation_id, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -443,18 +538,39 @@ def build_indexes_list_versions_request(name: str, **kwargs: Any) -> HttpRequest return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_list_request(**kwargs: Any) -> HttpRequest: +def build_agents_list_container_operations_request( # pylint: disable=name-too-long + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + after: Optional[str] = None, + before: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/indexes" + _url = "/agents/{agent_name}/operations" + path_format_arguments = { + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + if order is not None: + _params["order"] = _SERIALIZER.query("order", order, "str") + if after is not None: + _params["after"] = _SERIALIZER.query("after", after, "str") + if before is not None: + _params["before"] = _SERIALIZER.query("before", before, "str") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -462,24 +578,41 @@ def build_indexes_list_request(**kwargs: Any) -> HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_get_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_agents_list_version_container_operations_request( # pylint: disable=name-too-long + agent_name: str, + agent_version: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + after: Optional[str] = None, + before: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/indexes/{name}/versions/{version}" + _url = "/agents/{agent_name}/versions/{agent_version}/containers/default/operations" path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), + "agent_name": _SERIALIZER.url("agent_name", agent_name, "str"), + "agent_version": _SERIALIZER.url("agent_version", agent_version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + if order is not None: + _params["order"] = _SERIALIZER.query("order", order, "str") + if after is not None: + _params["after"] = _SERIALIZER.query("after", after, "str") + if before is not None: + _params["before"] = _SERIALIZER.query("before", before, "str") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -487,38 +620,42 @@ def build_indexes_get_request(name: str, version: str, **kwargs: Any) -> HttpReq return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_delete_request(name: str, version: str, **kwargs: Any) -> HttpRequest: +def build_memory_stores_create_memory_store_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - # Construct URL - _url = "/indexes/{name}/versions/{version}" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), - } + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") - _url: str = _url.format(**path_format_arguments) # type: ignore + # Construct URL + _url = "/memory_stores" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - return HttpRequest(method="DELETE", url=_url, params=_params, **kwargs) + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_create_or_update_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + +def build_memory_stores_update_memory_store_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/indexes/{name}/versions/{version}" + _url = "/memory_stores/{name}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), } _url: str = _url.format(**path_format_arguments) # type: ignore @@ -531,18 +668,20 @@ def build_indexes_create_or_update_request(name: str, version: str, **kwargs: An _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_deployments_get_request(name: str, **kwargs: Any) -> HttpRequest: +def build_memory_stores_get_memory_store_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/deployments/{name}" + _url = "/memory_stores/{name}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), } @@ -558,30 +697,33 @@ def build_deployments_get_request(name: str, **kwargs: Any) -> HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_deployments_list_request( +def build_memory_stores_list_memory_stores_request( # pylint: disable=name-too-long *, - model_publisher: Optional[str] = None, - model_name: Optional[str] = None, - deployment_type: Optional[Union[str, _models.DeploymentType]] = None, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + after: Optional[str] = None, + before: Optional[str] = None, **kwargs: Any ) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/deployments" + _url = "/memory_stores" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - if model_publisher is not None: - _params["modelPublisher"] = _SERIALIZER.query("model_publisher", model_publisher, "str") - if model_name is not None: - _params["modelName"] = _SERIALIZER.query("model_name", model_name, "str") - if deployment_type is not None: - _params["deploymentType"] = _SERIALIZER.query("deployment_type", deployment_type, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + if order is not None: + _params["order"] = _SERIALIZER.query("order", order, "str") + if after is not None: + _params["after"] = _SERIALIZER.query("after", after, "str") + if before is not None: + _params["before"] = _SERIALIZER.query("before", before, "str") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -589,15 +731,17 @@ def build_deployments_list_request( return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: +def build_memory_stores_delete_memory_store_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/redTeams/runs/{name}" + _url = "/memory_stores/{name}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), } @@ -610,38 +754,55 @@ def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_red_teams_list_request(**kwargs: Any) -> HttpRequest: +def build_memory_stores_search_memories_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/redTeams/runs" + _url = "/memory_stores/{name}:search_memories" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_red_teams_create_request(**kwargs: Any) -> HttpRequest: +def build_memory_stores_update_memories_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/redTeams/runs:run" + _url = "/memory_stores/{name}:update_memories" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") @@ -654,31 +815,6354 @@ def build_red_teams_create_request(**kwargs: Any) -> HttpRequest: return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -class ConnectionsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`connections` attribute. - """ +def build_memory_stores_get_update_result_request( # pylint: disable=name-too-long + name: str, update_id: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/memory_stores/{name}/updates/{update_id}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "update_id": _SERIALIZER.url("update_id", update_id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_memory_stores_delete_scope_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/memory_stores/{name}:delete_scope" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_connections_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_connections_get_with_credentials_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections/{name}/getConnectionWithCredentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_connections_list_request( + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if connection_type is not None: + _params["connectionType"] = _SERIALIZER.query("connection_type", connection_type, "str") + if default_connection is not None: + _params["defaultConnection"] = _SERIALIZER.query("default_connection", default_connection, "bool") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_list_versions_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_list_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_get_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_delete_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, **kwargs) + + +def build_datasets_create_or_update_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_pending_upload_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}/startPendingUpload" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_get_credentials_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}/credentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_list_versions_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_list_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_get_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_delete_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, **kwargs) + + +def build_indexes_create_or_update_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_deployments_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/deployments/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_deployments_list_request( + *, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + deployment_type: Optional[Union[str, _models.DeploymentType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/deployments" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if model_publisher is not None: + _params["modelPublisher"] = _SERIALIZER.query("model_publisher", model_publisher, "str") + if model_name is not None: + _params["modelName"] = _SERIALIZER.query("model_name", model_name, "str") + if deployment_type is not None: + _params["deploymentType"] = _SERIALIZER.query("deployment_type", deployment_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_list_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_create_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs:run" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_rules_get_request(id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationrules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_rules_delete_request(id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/evaluationrules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_rules_create_or_update_request( # pylint: disable=name-too-long + id: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationrules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_rules_list_request( + *, + action_type: Optional[Union[str, _models.EvaluationRuleActionType]] = None, + agent_name: Optional[str] = None, + enabled: Optional[bool] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationrules" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if action_type is not None: + _params["actionType"] = _SERIALIZER.query("action_type", action_type, "str") + if agent_name is not None: + _params["agentName"] = _SERIALIZER.query("agent_name", agent_name, "str") + if enabled is not None: + _params["enabled"] = _SERIALIZER.query("enabled", enabled, "bool") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_taxonomies_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluation_taxonomies/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_taxonomies_list_request( + *, input_name: Optional[str] = None, input_type: Optional[str] = None, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluation_taxonomies" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if input_name is not None: + _params["inputName"] = _SERIALIZER.query("input_name", input_name, "str") + if input_type is not None: + _params["inputType"] = _SERIALIZER.query("input_type", input_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_taxonomies_delete_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/evaluation_taxonomies/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_taxonomies_create_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluation_taxonomies/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_taxonomies_update_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluation_taxonomies/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluators_list_versions_request( + name: str, + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluators/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if type is not None: + _params["type"] = _SERIALIZER.query("type", type, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluators_list_latest_versions_request( # pylint: disable=name-too-long + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluators" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if type is not None: + _params["type"] = _SERIALIZER.query("type", type, "str") + if limit is not None: + _params["limit"] = _SERIALIZER.query("limit", limit, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluators_get_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluators/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluators_delete_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/evaluators/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, **kwargs) + + +def build_evaluators_create_version_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluators/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluators_update_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluators/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_insights_generate_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/insights" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if "Repeatability-Request-ID" not in _headers: + _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) + if "Repeatability-First-Sent" not in _headers: + _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( + datetime.datetime.now(datetime.timezone.utc), "rfc-1123" + ) + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_insights_get_request(id: str, *, include_coordinates: Optional[bool] = None, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/insights/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if include_coordinates is not None: + _params["includeCoordinates"] = _SERIALIZER.query("include_coordinates", include_coordinates, "bool") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_insights_list_request( + *, + type: Optional[Union[str, _models.InsightType]] = None, + eval_id: Optional[str] = None, + run_id: Optional[str] = None, + agent_name: Optional[str] = None, + include_coordinates: Optional[bool] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/insights" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if type is not None: + _params["type"] = _SERIALIZER.query("type", type, "str") + if eval_id is not None: + _params["evalId"] = _SERIALIZER.query("eval_id", eval_id, "str") + if run_id is not None: + _params["runId"] = _SERIALIZER.query("run_id", run_id, "str") + if agent_name is not None: + _params["agentName"] = _SERIALIZER.query("agent_name", agent_name, "str") + if include_coordinates is not None: + _params["includeCoordinates"] = _SERIALIZER.query("include_coordinates", include_coordinates, "bool") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_delete_request(id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + # Construct URL + _url = "/schedules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_get_request(id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/schedules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_list_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/schedules" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_create_or_update_request(id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/schedules/{id}" + path_format_arguments = { + "id": _SERIALIZER.url("id", id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_get_run_request(schedule_id: str, run_id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/schedules/{scheduleId}/runs/{runId}" + path_format_arguments = { + "scheduleId": _SERIALIZER.url("schedule_id", schedule_id, "str"), + "runId": _SERIALIZER.url("run_id", run_id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_schedules_list_runs_request(schedule_id: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-11-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/schedules/{scheduleId}/runs" + path_format_arguments = { + "scheduleId": _SERIALIZER.url("schedule_id", schedule_id, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +class AgentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`agents` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def retrieve(self, agent_name: str, **kwargs: Any) -> _models.AgentObject: + """Retrieves the agent. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_request( + agent_name=agent_name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def create( + self, + *, + name: str, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates the agent. + + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create(self, body: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.AgentObject: + """Creates the agent. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create(self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any) -> _models.AgentObject: + """Creates the agent. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates the agent. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata, "name": name} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def update( + self, + agent_name: str, + *, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def update( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent by adding a new version if there are any changes to the agent definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def create_agent_from_manifest( + self, + *, + name: str, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_agent_from_manifest( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_agent_from_manifest( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create_agent_from_manifest( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Creates an agent from a manifest. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :paramtype name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "name": name, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_agent_from_manifest_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def update_agent_from_manifest( + self, + agent_name: str, + *, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_agent_from_manifest( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_agent_from_manifest( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def update_agent_from_manifest( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentObject: + """Updates the agent from a manifest by adding a new version if there are any changes to the agent + definition. + If no changes, returns the existing agent version. + + :param agent_name: The name of the agent to update. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentObject. The AgentObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentObject] = kwargs.pop("cls", None) + + if body is _Unset: + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_agent_from_manifest_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete(self, agent_name: str, **kwargs: Any) -> _models.DeleteAgentResponse: + """Deletes an agent. + + :param agent_name: The name of the agent to delete. Required. + :type agent_name: str + :return: DeleteAgentResponse. The DeleteAgentResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DeleteAgentResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteAgentResponse] = kwargs.pop("cls", None) + + _request = build_agents_delete_request( + agent_name=agent_name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteAgentResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "kind", "limit", "order", "after", "before", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, + *, + kind: Optional[Union[str, _models.AgentKind]] = None, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> ItemPaged["_models.AgentObject"]: + """Returns the list of all agents. + + :keyword kind: Filter agents by kind. If not provided, all agents are returned. Known values + are: "prompt", "hosted", "container_app", and "workflow". Default value is None. + :paramtype kind: str or ~azure.ai.projects.models.AgentKind + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentObject + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.AgentObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_request( + kind=kind, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, iter(list_of_elem) + + def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @overload + def create_version( + self, + agent_name: str, + *, + definition: _models.AgentDefinition, + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create_version( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + definition: _models.AgentDefinition = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword definition: The agent definition. This can be a workflow, hosted agent, or a simple + agent definition. Required. + :paramtype definition: ~azure.ai.projects.models.AgentDefinition + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + if body is _Unset: + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_version_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def create_agent_version_from_manifest( + self, + agent_name: str, + *, + manifest_id: str, + parameter_values: dict[str, Any], + content_type: str = "application/json", + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_agent_version_from_manifest( + self, agent_name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_agent_version_from_manifest( + self, agent_name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create_agent_version_from_manifest( + self, + agent_name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + manifest_id: str = _Unset, + parameter_values: dict[str, Any] = _Unset, + metadata: Optional[dict[str, str]] = None, + description: Optional[str] = None, + **kwargs: Any + ) -> _models.AgentVersionObject: + """Create a new agent version from a manifest. + + :param agent_name: The unique name that identifies the agent. Name can be used to + retrieve/update/delete the agent. + + * Must start and end with alphanumeric characters, + * Can contain hyphens in the middle + * Must not exceed 63 characters. Required. + :type agent_name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword manifest_id: The manifest ID to import the agent version from. Required. + :paramtype manifest_id: str + :keyword parameter_values: The inputs to the manifest that will result in a fully materialized + Agent. Required. + :paramtype parameter_values: dict[str, any] + :keyword metadata: Set of 16 key-value pairs that can be attached to an object. This can be + useful for storing additional information about the object in a structured + format, and querying for objects via API or the dashboard. + + Keys are strings with a maximum length of 64 characters. Values are strings + with a maximum length of 512 characters. Default value is None. + :paramtype metadata: dict[str, str] + :keyword description: A human-readable description of the agent. Default value is None. + :paramtype description: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + if body is _Unset: + if manifest_id is _Unset: + raise TypeError("missing required argument: manifest_id") + if parameter_values is _Unset: + raise TypeError("missing required argument: parameter_values") + body = { + "description": description, + "manifest_id": manifest_id, + "metadata": metadata, + "parameter_values": parameter_values, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_create_agent_version_from_manifest_request( + agent_name=agent_name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def retrieve_version(self, agent_name: str, agent_version: str, **kwargs: Any) -> _models.AgentVersionObject: + """Retrieves a specific version of an agent. + + :param agent_name: The name of the agent to retrieve. Required. + :type agent_name: str + :param agent_version: The version of the agent to retrieve. Required. + :type agent_version: str + :return: AgentVersionObject. The AgentVersionObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentVersionObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentVersionObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_version_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentVersionObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete_version(self, agent_name: str, agent_version: str, **kwargs: Any) -> _models.DeleteAgentVersionResponse: + """Deletes a specific version of an agent. + + :param agent_name: The name of the agent to delete. Required. + :type agent_name: str + :param agent_version: The version of the agent to delete. Required. + :type agent_version: str + :return: DeleteAgentVersionResponse. The DeleteAgentVersionResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.DeleteAgentVersionResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteAgentVersionResponse] = kwargs.pop("cls", None) + + _request = build_agents_delete_version_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteAgentVersionResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "limit", "order", "after", "before", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_versions( + self, + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> ItemPaged["_models.AgentVersionObject"]: + """Returns the list of versions of an agent. + + :param agent_name: The name of the agent to retrieve versions for. Required. + :type agent_name: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentVersionObject + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.AgentVersionObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentVersionObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_versions_request( + agent_name=agent_name, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentVersionObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, iter(list_of_elem) + + def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @overload + def start_container( + self, + agent_name: str, + agent_version: str, + *, + content_type: str = "application/json", + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword min_replicas: The minimum number of replicas. Defaults to 1. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Defaults to 1. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_container( + self, agent_name: str, agent_version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_container( + self, + agent_name: str, + agent_version: str, + body: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "agent_version", "content_type", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def start_container( + self, + agent_name: str, + agent_version: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Start a container for a specific version of an agent. If the container is already running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword min_replicas: The minimum number of replicas. Defaults to 1. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Defaults to 1. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"max_replicas": max_replicas, "min_replicas": min_replicas} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_start_container_request( + agent_name=agent_name, + agent_version=agent_version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def update_container( + self, + agent_name: str, + agent_version: str, + *, + content_type: str = "application/json", + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword min_replicas: The minimum number of replicas. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_container( + self, agent_name: str, agent_version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_container( + self, + agent_name: str, + agent_version: str, + body: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "agent_version", "content_type", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def update_container( + self, + agent_name: str, + agent_version: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + min_replicas: Optional[int] = None, + max_replicas: Optional[int] = None, + **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Update a container for a specific version of an agent. If the container is not running, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword min_replicas: The minimum number of replicas. Default value is None. + :paramtype min_replicas: int + :keyword max_replicas: The maximum number of replicas. Default value is None. + :paramtype max_replicas: int + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"max_replicas": max_replicas, "min_replicas": min_replicas} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_agents_update_container_request( + agent_name=agent_name, + agent_version=agent_version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def stop_container( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Stop a container for a specific version of an agent. If the container is not running, or + already stopped, the operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_stop_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete_container( + self, agent_name: str, agent_version: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Delete a container for a specific version of an agent. If the container doesn't exist, the + operation will be no-op. + The operation is a long-running operation. Following the design guidelines for long-running + operations in Azure REST APIs. + `https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md#action-operations + `_. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_delete_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "agent_version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def retrieve_container(self, agent_name: str, agent_version: str, **kwargs: Any) -> _models.AgentContainerObject: + """Get a container for a specific version of an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :return: AgentContainerObject. The AgentContainerObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_container_request( + agent_name=agent_name, + agent_version=agent_version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "agent_name", "operation_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def retrieve_container_operation( + self, agent_name: str, operation_id: str, **kwargs: Any + ) -> _models.AgentContainerOperationObject: + """Get the status of a container operation for an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param operation_id: The operation ID. Required. + :type operation_id: str + :return: AgentContainerOperationObject. The AgentContainerOperationObject is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.AgentContainerOperationObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.AgentContainerOperationObject] = kwargs.pop("cls", None) + + _request = build_agents_retrieve_container_operation_request( + agent_name=agent_name, + operation_id=operation_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AgentContainerOperationObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "agent_name", "limit", "order", "after", "before", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_container_operations( + self, + agent_name: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> ItemPaged["_models.AgentContainerOperationObject"]: + """List container operations for an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentContainerOperationObject + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.AgentContainerOperationObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentContainerOperationObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_container_operations_request( + agent_name=agent_name, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentContainerOperationObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, iter(list_of_elem) + + def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "agent_name", + "agent_version", + "limit", + "order", + "after", + "before", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list_version_container_operations( + self, + agent_name: str, + agent_version: str, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> ItemPaged["_models.AgentContainerOperationObject"]: + """List container operations for a specific version of an agent. + + :param agent_name: The name of the agent. Required. + :type agent_name: str + :param agent_version: The version of the agent. Required. + :type agent_version: str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of AgentContainerOperationObject + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.AgentContainerOperationObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.AgentContainerOperationObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_agents_list_version_container_operations_request( + agent_name=agent_name, + agent_version=agent_version, + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.AgentContainerOperationObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, iter(list_of_elem) + + def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + +class MemoryStoresOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`memory_stores` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @overload + def create_memory_store( + self, + *, + name: str, + definition: _models.MemoryStoreDefinition, + content_type: str = "application/json", + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :keyword name: The name of the memory store. Required. + :paramtype name: str + :keyword definition: The memory store definition. Required. + :paramtype definition: ~azure.ai.projects.models.MemoryStoreDefinition + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_memory_store( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_memory_store( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create_memory_store( + self, + body: Union[JSON, IO[bytes]] = _Unset, + *, + name: str = _Unset, + definition: _models.MemoryStoreDefinition = _Unset, + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Create a memory store. + + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword name: The name of the memory store. Required. + :paramtype name: str + :keyword definition: The memory store definition. Required. + :paramtype definition: ~azure.ai.projects.models.MemoryStoreDefinition + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + if body is _Unset: + if name is _Unset: + raise TypeError("missing required argument: name") + if definition is _Unset: + raise TypeError("missing required argument: definition") + body = {"definition": definition, "description": description, "metadata": metadata, "name": name} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_create_memory_store_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def update_memory_store( + self, + name: str, + *, + content_type: str = "application/json", + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_memory_store( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def update_memory_store( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def update_memory_store( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + description: Optional[str] = None, + metadata: Optional[dict[str, str]] = None, + **kwargs: Any + ) -> _models.MemoryStoreObject: + """Update a memory store. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword description: A human-readable description of the memory store. Default value is None. + :paramtype description: str + :keyword metadata: Arbitrary key-value metadata to associate with the memory store. Default + value is None. + :paramtype metadata: dict[str, str] + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + if body is _Unset: + body = {"description": description, "metadata": metadata} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_update_memory_store_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get_memory_store(self, name: str, **kwargs: Any) -> _models.MemoryStoreObject: + """Retrieve a memory store. + + :param name: The name of the memory store to retrieve. Required. + :type name: str + :return: MemoryStoreObject. The MemoryStoreObject is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreObject + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.MemoryStoreObject] = kwargs.pop("cls", None) + + _request = build_memory_stores_get_memory_store_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreObject, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "limit", "order", "after", "before", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_memory_stores( + self, + *, + limit: Optional[int] = None, + order: Optional[Literal["asc", "desc"]] = None, + before: Optional[str] = None, + **kwargs: Any + ) -> ItemPaged["_models.MemoryStoreObject"]: + """List all memory stores. + + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the + default is 20. Default value is None. + :paramtype limit: int + :keyword order: Sort order by the ``created_at`` timestamp of the objects. ``asc`` for + ascending order and``desc`` + for descending order. Is either a Literal["asc"] type or a Literal["desc"] type. Default value + is None. + :paramtype order: str or str + :keyword before: A cursor for use in pagination. ``before`` is an object ID that defines your + place in the list. + For instance, if you make a list request and receive 100 objects, ending with obj_foo, your + subsequent call can include before=obj_foo in order to fetch the previous page of the list. + Default value is None. + :paramtype before: str + :return: An iterator like instance of MemoryStoreObject + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.MemoryStoreObject] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.MemoryStoreObject]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(_continuation_token=None): + + _request = build_memory_stores_list_memory_stores_request( + limit=limit, + order=order, + after=_continuation_token, + before=before, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.MemoryStoreObject], deserialized.get("data", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("last_id") or None, iter(list_of_elem) + + def get_next(_continuation_token=None): + _request = prepare_request(_continuation_token) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete_memory_store(self, name: str, **kwargs: Any) -> _models.DeleteMemoryStoreResponse: + """Delete a memory store. + + :param name: The name of the memory store to delete. Required. + :type name: str + :return: DeleteMemoryStoreResponse. The DeleteMemoryStoreResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.DeleteMemoryStoreResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DeleteMemoryStoreResponse] = kwargs.pop("cls", None) + + _request = build_memory_stores_delete_memory_store_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DeleteMemoryStoreResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def search_memories( + self, + name: str, + *, + scope: str, + content_type: str = "application/json", + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_search_id: Optional[str] = None, + options: Optional[_models.MemorySearchOptions] = None, + **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword conversation_id: The conversation ID for which to search memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Items for which to search for relevant memories. Only one of conversation_id or + items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_search_id: The unique ID of the previous search request, enabling incremental + memory search from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_search_id: str + :keyword options: Memory search options. Default value is None. + :paramtype options: ~azure.ai.projects.models.MemorySearchOptions + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def search_memories( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def search_memories( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def search_memories( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_search_id: Optional[str] = None, + options: Optional[_models.MemorySearchOptions] = None, + **kwargs: Any + ) -> _models.MemoryStoreSearchResponse: + """Search for relevant memories from a memory store based on conversation context. + + :param name: The name of the memory store to search. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword conversation_id: The conversation ID for which to search memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Items for which to search for relevant memories. Only one of conversation_id or + items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_search_id: The unique ID of the previous search request, enabling incremental + memory search from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_search_id: str + :keyword options: Memory search options. Default value is None. + :paramtype options: ~azure.ai.projects.models.MemorySearchOptions + :return: MemoryStoreSearchResponse. The MemoryStoreSearchResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreSearchResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreSearchResponse] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = { + "conversation_id": conversation_id, + "items_property": items, + "options": options, + "previous_search_id": previous_search_id, + "scope": scope, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_search_memories_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreSearchResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def _update_memories_initial( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> Iterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[Iterator[bytes]] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = { + "conversation_id": conversation_id, + "items_property": items, + "previous_update_id": previous_update_id, + "scope": scope, + "update_delay": update_delay, + } + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_update_memories_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = True + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers["Operation-Location"] = self._deserialize("str", response.headers.get("Operation-Location")) + + deserialized = response.iter_bytes() + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def begin_update_memories( + self, + name: str, + *, + scope: str, + content_type: str = "application/json", + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> LROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :keyword conversation_id: The conversation ID from which to extract memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Conversation items from which to extract memories. Only one of conversation_id + or items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_update_id: The unique ID of the previous update request, enabling incremental + memory updates from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_update_id: str + :keyword update_delay: Timeout period before processing the memory update in seconds. + If a new update request is received during this period, it will cancel the current request and + reset the timeout. + Set to 0 to immediately trigger the update without delay. + Defaults to 300 (5 minutes). Default value is None. + :paramtype update_delay: int + :return: An instance of LROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.LROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def begin_update_memories( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> LROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of LROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.LROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def begin_update_memories( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> LROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of LROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.LROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def begin_update_memories( + self, + name: str, + body: Union[JSON, IO[bytes]] = _Unset, + *, + scope: str = _Unset, + conversation_id: Optional[str] = None, + items: Optional[List[_models.ItemParam]] = None, + previous_update_id: Optional[str] = None, + update_delay: Optional[int] = None, + **kwargs: Any + ) -> LROPoller[_models.MemoryStoreUpdateResult]: + """Update memory store with conversation memories. + + :param name: The name of the memory store to update. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories, such as a user ID. + Required. + :paramtype scope: str + :keyword conversation_id: The conversation ID from which to extract memories. Only one of + conversation_id or items should be provided. Default value is None. + :paramtype conversation_id: str + :keyword items: Conversation items from which to extract memories. Only one of conversation_id + or items should be provided. Default value is None. + :paramtype items: list[~azure.ai.projects.models.ItemParam] + :keyword previous_update_id: The unique ID of the previous update request, enabling incremental + memory updates from where the last operation left off. Cannot be used together with + conversation_id. Default value is None. + :paramtype previous_update_id: str + :keyword update_delay: Timeout period before processing the memory update in seconds. + If a new update request is received during this period, it will cancel the current request and + reset the timeout. + Set to 0 to immediately trigger the update without delay. + Defaults to 300 (5 minutes). Default value is None. + :paramtype update_delay: int + :return: An instance of LROPoller that returns MemoryStoreUpdateResult. The + MemoryStoreUpdateResult is compatible with MutableMapping + :rtype: ~azure.core.polling.LROPoller[~azure.ai.projects.models.MemoryStoreUpdateResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreUpdateResult] = kwargs.pop("cls", None) + polling: Union[bool, PollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = self._update_memories_initial( + name=name, + body=body, + scope=scope, + conversation_id=conversation_id, + items=items, + previous_update_id=previous_update_id, + update_delay=update_delay, + content_type=content_type, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + response_headers = {} + response = pipeline_response.http_response + response_headers["Operation-Location"] = self._deserialize( + "str", response.headers.get("Operation-Location") + ) + + deserialized = _deserialize(_models.MemoryStoreUpdateResult, response.json().get("result", {})) + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + return deserialized + + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + + if polling is True: + polling_method: PollingMethod = cast( + PollingMethod, LROBasePolling(lro_delay, path_format_arguments=path_format_arguments, **kwargs) + ) + elif polling is False: + polling_method = cast(PollingMethod, NoPolling()) + else: + polling_method = polling + if cont_token: + return LROPoller[_models.MemoryStoreUpdateResult].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return LROPoller[_models.MemoryStoreUpdateResult]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "update_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get_update_result(self, name: str, update_id: str, **kwargs: Any) -> _models.MemoryStoreUpdateResponse: + """Get memory store update result. + + :param name: The name of the memory store. Required. + :type name: str + :param update_id: The ID of the memory update operation. Required. + :type update_id: str + :return: MemoryStoreUpdateResponse. The MemoryStoreUpdateResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreUpdateResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.MemoryStoreUpdateResponse] = kwargs.pop("cls", None) + + _request = build_memory_stores_get_update_result_request( + name=name, + update_id=update_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreUpdateResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def delete_scope( + self, name: str, *, scope: str, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :keyword scope: The namespace that logically groups and isolates memories to delete, such as a + user ID. Required. + :paramtype scope: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def delete_scope( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def delete_scope( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete_scope( + self, name: str, body: Union[JSON, IO[bytes]] = _Unset, *, scope: str = _Unset, **kwargs: Any + ) -> _models.MemoryStoreDeleteScopeResponse: + """Delete all memories associated with a specific scope from a memory store. + + :param name: The name of the memory store. Required. + :type name: str + :param body: Is either a JSON type or a IO[bytes] type. Required. + :type body: JSON or IO[bytes] + :keyword scope: The namespace that logically groups and isolates memories to delete, such as a + user ID. Required. + :paramtype scope: str + :return: MemoryStoreDeleteScopeResponse. The MemoryStoreDeleteScopeResponse is compatible with + MutableMapping + :rtype: ~azure.ai.projects.models.MemoryStoreDeleteScopeResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.MemoryStoreDeleteScopeResponse] = kwargs.pop("cls", None) + + if body is _Unset: + if scope is _Unset: + raise TypeError("missing required argument: scope") + body = {"scope": scope} + body = {k: v for k, v in body.items() if v is not None} + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_memory_stores_delete_scope_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = _failsafe_deserialize( + _models.ApiErrorResponse, + response, + ) + raise HttpResponseError(response=response, model=error) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.MemoryStoreDeleteScopeResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class ConnectionsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`connections` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def _get(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, without populating connection credentials. + + :param name: The friendly name of the connection, provided by the user. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. + + :param name: The friendly name of the connection, provided by the user. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_with_credentials_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, + **kwargs: Any + ) -> ItemPaged["_models.Connection"]: + """List all connections in the project, without populating connection credentials. + + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", "CustomKeys", and "RemoteTool". Default value is None. + :paramtype connection_type: str or ~azure.ai.projects.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool + :return: An iterator like instance of Connection + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Connection] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_connections_list_request( + connection_type=connection_type, + default_connection=default_connection, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + +class DatasetsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`datasets` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.DatasetVersion"]: + """List all versions of the given DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_versions_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def list(self, **kwargs: Any) -> ItemPaged["_models.DatasetVersion"]: + """List the latest version of each DatasetVersion. + + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def get(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: + """Get the specific version of the DatasetVersion. The service returns 404 Not Found error if the + DatasetVersion does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to retrieve. Required. + :type version: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + _request = build_datasets_get_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements + """Delete the specific version of the DatasetVersion. The service returns 204 No Content if the + DatasetVersion was deleted successfully or if the DatasetVersion does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the DatasetVersion to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_datasets_delete_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + def create_or_update( + self, + name: str, + version: str, + dataset_version: _models.DatasetVersion, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: ~azure.ai.projects.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, + name: str, + version: str, + dataset_version: JSON, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, + name: str, + version: str, + dataset_version: IO[bytes], + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Required. + :type dataset_version: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def create_or_update( + self, name: str, version: str, dataset_version: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or update an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or update. Required. + :type version: str + :param dataset_version: The DatasetVersion to create or update. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type dataset_version: ~azure.ai.projects.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/merge-patch+json" + _content = None + if isinstance(dataset_version, (IOBase, bytes)): + _content = dataset_version + else: + _content = json.dumps(dataset_version, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_or_update_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def pending_upload( + self, + name: str, + version: str, + pending_upload_request: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def pending_upload( + self, + name: str, + version: str, + pending_upload_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def pending_upload( + self, + name: str, + version: str, + pending_upload_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Required. + :type pending_upload_request: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def pending_upload( + self, + name: str, + version: str, + pending_upload_request: Union[_models.PendingUploadRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param pending_upload_request: The pending upload request parameters. Is one of the following + types: PendingUploadRequest, JSON, IO[bytes] Required. + :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest or JSON or + IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(pending_upload_request, (IOBase, bytes)): + _content = pending_upload_request + else: + _content = json.dumps(pending_upload_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_pending_upload_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def get_credentials(self, name: str, version: str, **kwargs: Any) -> _models.DatasetCredential: + """Get the SAS credential to access the storage account associated with a Dataset version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :return: DatasetCredential. The DatasetCredential is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.DatasetCredential + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetCredential] = kwargs.pop("cls", None) + + _request = build_datasets_get_credentials_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetCredential, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class IndexesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`indexes` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.Index"]: + """List all versions of the given Index. + + :param name: The name of the resource. Required. + :type name: str + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_versions_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def list(self, **kwargs: Any) -> ItemPaged["_models.Index"]: + """List the latest version of each Index. + + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: + """Get the specific version of the Index. The service returns 404 Not Found error if the Index + does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to retrieve. Required. + :type version: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + _request = build_indexes_get_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements + """Delete the specific version of the Index. The service returns 204 No Content if the Index was + deleted successfully or if the Index does not exist. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the Index to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_indexes_delete_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + def create_or_update( + self, + name: str, + version: str, + index: _models.Index, + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: ~azure.ai.projects.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, name: str, version: str, index: JSON, *, content_type: str = "application/merge-patch+json", **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, + name: str, + version: str, + index: IO[bytes], + *, + content_type: str = "application/merge-patch+json", + **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Required. + :type index: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/merge-patch+json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace - def _get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name, without populating connection credentials. + def create_or_update( + self, name: str, version: str, index: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or update an existing Index with the given version id. - :param name: The friendly name of the connection, provided by the user. Required. + :param name: The name of the resource. Required. :type name: str - :return: Connection. The Connection is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Connection + :param version: The specific version id of the Index to create or update. Required. + :type version: str + :param index: The Index to create or update. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type index: ~azure.ai.projects.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -689,14 +7173,25 @@ def _get(self, name: str, **kwargs: Any) -> _models.Connection: } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = kwargs.pop("headers", {}) or {} + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) - _request = build_connections_get_request( + content_type = content_type or "application/merge-patch+json" + _content = None + if isinstance(index, (IOBase, bytes)): + _content = index + else: + _content = json.dumps(index, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_or_update_request( name=name, + version=version, + content_type=content_type, api_version=self._config.api_version, + content=_content, headers=_headers, params=_params, ) @@ -712,7 +7207,7 @@ def _get(self, name: str, **kwargs: Any) -> _models.Connection: response = pipeline_response.http_response - if response.status_code not in [200]: + if response.status_code not in [200, 201]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -721,29 +7216,42 @@ def _get(self, name: str, **kwargs: Any) -> _models.Connection: map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Connection, response.json()) + deserialized = _deserialize(_models.Index, response.json()) if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore + +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`deployments` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + @distributed_trace - def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name, with its connection credentials. + def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. - :param name: The friendly name of the connection, provided by the user. Required. + :param name: Name of the deployment. Required. :type name: str - :return: Connection. The Connection is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Connection + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Deployment :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -757,9 +7265,9 @@ def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) - _request = build_connections_get_with_credentials_request( + _request = build_deployments_get_request( name=name, api_version=self._config.api_version, headers=_headers, @@ -794,7 +7302,7 @@ def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Connection, response.json()) + deserialized = _deserialize(_models.Deployment, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -805,27 +7313,29 @@ def _get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: def list( self, *, - connection_type: Optional[Union[str, _models.ConnectionType]] = None, - default_connection: Optional[bool] = None, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + deployment_type: Optional[Union[str, _models.DeploymentType]] = None, **kwargs: Any - ) -> ItemPaged["_models.Connection"]: - """List all connections in the project, without populating connection credentials. + ) -> ItemPaged["_models.Deployment"]: + """List all deployed models in the project. - :keyword connection_type: List connections of this specific type. Known values are: - "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", - "AppConfig", "AppInsights", and "CustomKeys". Default value is None. - :paramtype connection_type: str or ~azure.ai.projects.models.ConnectionType - :keyword default_connection: List connections that are default connections. Default value is - None. - :paramtype default_connection: bool - :return: An iterator like instance of Connection - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Connection] + :keyword model_publisher: Model publisher to filter models by. Default value is None. + :paramtype model_publisher: str + :keyword model_name: Model name (the publisher specific name) to filter models by. Default + value is None. + :paramtype model_name: str + :keyword deployment_type: Type of deployment to filter list by. "ModelDeployment" Default value + is None. + :paramtype deployment_type: str or ~azure.ai.projects.models.DeploymentType + :return: An iterator like instance of Deployment + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Deployment] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -838,9 +7348,10 @@ def list( def prepare_request(next_link=None): if not next_link: - _request = build_connections_list_request( - connection_type=connection_type, - default_connection=default_connection, + _request = build_deployments_list_request( + model_publisher=model_publisher, + model_name=model_name, + deployment_type=deployment_type, api_version=self._config.api_version, headers=_headers, params=_params, @@ -876,7 +7387,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -899,14 +7410,14 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) -class EvaluationsOperations: +class RedTeamsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`evaluations` attribute. + :attr:`red_teams` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -920,15 +7431,15 @@ def __init__(self, *args, **kwargs) -> None: @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - def get(self, name: str, **kwargs: Any) -> _models.Evaluation: - """Get an evaluation run by name. + def get(self, name: str, **kwargs: Any) -> _models.RedTeam: + """Get a redteam by name. - :param name: Identifier of the evaluation. Required. + :param name: Identifier of the red team run. Required. :type name: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -942,9 +7453,9 @@ def get(self, name: str, **kwargs: Any) -> _models.Evaluation: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) - _request = build_evaluations_get_request( + _request = build_red_teams_get_request( name=name, api_version=self._config.api_version, headers=_headers, @@ -979,7 +7490,7 @@ def get(self, name: str, **kwargs: Any) -> _models.Evaluation: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Evaluation, response.json()) + deserialized = _deserialize(_models.RedTeam, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -990,19 +7501,19 @@ def get(self, name: str, **kwargs: Any) -> _models.Evaluation: @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - def list(self, **kwargs: Any) -> ItemPaged["_models.Evaluation"]: - """List evaluation runs. + def list(self, **kwargs: Any) -> ItemPaged["_models.RedTeam"]: + """List a redteam by name. - :return: An iterator like instance of Evaluation - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Evaluation] + :return: An iterator like instance of RedTeam + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.RedTeam] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Evaluation]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1015,7 +7526,7 @@ def list(self, **kwargs: Any) -> ItemPaged["_models.Evaluation"]: def prepare_request(next_link=None): if not next_link: - _request = build_evaluations_list_request( + _request = build_red_teams_list_request( api_version=self._config.api_version, headers=_headers, params=_params, @@ -1051,7 +7562,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Evaluation], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -1075,47 +7586,45 @@ def get_next(next_link=None): @overload def create( - self, evaluation: _models.Evaluation, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: - """Creates an evaluation run. + self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: ~azure.ai.projects.models.Evaluation + :param red_team: Redteam to be run. Required. + :type red_team: ~azure.ai.projects.models.RedTeam :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create(self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.Evaluation: - """Creates an evaluation run. + def create(self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: JSON + :param red_team: Redteam to be run. Required. + :type red_team: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create( - self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: - """Creates an evaluation run. + def create(self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Required. - :type evaluation: IO[bytes] + :param red_team: Redteam to be run. Required. + :type red_team: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ @@ -1123,16 +7632,16 @@ def create( @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + api_versions_list=["2025-05-15-preview", "2025-11-15-preview"], ) - def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwargs: Any) -> _models.Evaluation: - """Creates an evaluation run. + def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. - :param evaluation: Evaluation to be run. Is one of the following types: Evaluation, JSON, - IO[bytes] Required. - :type evaluation: ~azure.ai.projects.models.Evaluation or JSON or IO[bytes] - :return: Evaluation. The Evaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Evaluation + :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + Required. + :type red_team: ~azure.ai.projects.models.RedTeam or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1147,16 +7656,16 @@ def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwarg _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(evaluation, (IOBase, bytes)): - _content = evaluation + if isinstance(red_team, (IOBase, bytes)): + _content = red_team else: - _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_evaluations_create_request( + _request = build_red_teams_create_request( content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1187,77 +7696,44 @@ def create(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwarg if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Evaluation, response.json()) + deserialized = _deserialize(_models.RedTeam, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore - @overload - def create_agent_evaluation( - self, evaluation: _models.AgentEvaluationRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. - - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: ~azure.ai.projects.models.AgentEvaluationRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create_agent_evaluation( - self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ +class EvaluationRulesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - @overload - def create_agent_evaluation( - self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`evaluation_rules` attribute. + """ - :param evaluation: Agent evaluation to be run. Required. - :type evaluation: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation - :raises ~azure.core.exceptions.HttpResponseError: - """ + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - def create_agent_evaluation( - self, evaluation: Union[_models.AgentEvaluationRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.AgentEvaluation: - """Creates an agent evaluation run. + def get(self, id: str, **kwargs: Any) -> _models.EvaluationRule: + """Get an evaluation rule. - :param evaluation: Agent evaluation to be run. Is one of the following types: - AgentEvaluationRequest, JSON, IO[bytes] Required. - :type evaluation: ~azure.ai.projects.models.AgentEvaluationRequest or JSON or IO[bytes] - :return: AgentEvaluation. The AgentEvaluation is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.AgentEvaluation + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1268,23 +7744,14 @@ def create_agent_evaluation( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.AgentEvaluation] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(evaluation, (IOBase, bytes)): - _content = evaluation - else: - _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[_models.EvaluationRule] = kwargs.pop("cls", None) - _request = build_evaluations_create_agent_evaluation_request( - content_type=content_type, + _request = build_evaluation_rules_get_request( + id=id, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -1300,7 +7767,7 @@ def create_agent_evaluation( response = pipeline_response.http_response - if response.status_code not in [201]: + if response.status_code not in [200]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -1309,27 +7776,32 @@ def create_agent_evaluation( map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.AgentEvaluation, response.json()) + deserialized = _deserialize(_models.EvaluationRule, response.json()) if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore + return cls(pipeline_response, deserialized, response_headers) # type: ignore return deserialized # type: ignore @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], ) - def cancel(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements - """Cancel an evaluation run by name. + def delete(self, id: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements + """Delete an evaluation rule. - :param name: Identifier of the evaluation. Required. - :type name: str + :param id: Unique identifier for the evaluation rule. Required. + :type id: str :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: @@ -1347,8 +7819,8 @@ def cancel(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsist cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_evaluations_cancel_request( - name=name, + _request = build_evaluation_rules_delete_request( + id=id, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1377,19 +7849,78 @@ def cancel(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsist if cls: return cls(pipeline_response, None, response_headers) # type: ignore + @overload + def create_or_update( + self, id: str, evaluation_rule: _models.EvaluationRule, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: ~azure.ai.projects.models.EvaluationRule + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, id: str, evaluation_rule: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_or_update( + self, id: str, evaluation_rule: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Required. + :type evaluation_rule: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule + :raises ~azure.core.exceptions.HttpResponseError: + """ + @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - def delete(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements - """Delete an evaluation run by name. - - :param name: Identifier of the evaluation. Required. - :type name: str - :return: None - :rtype: None + def create_or_update( + self, id: str, evaluation_rule: Union[_models.EvaluationRule, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationRule: + """Create or update an evaluation rule. + + :param id: Unique identifier for the evaluation rule. Required. + :type id: str + :param evaluation_rule: Evaluation rule resource. Is one of the following types: + EvaluationRule, JSON, IO[bytes] Required. + :type evaluation_rule: ~azure.ai.projects.models.EvaluationRule or JSON or IO[bytes] + :return: EvaluationRule. The EvaluationRule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationRule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1400,14 +7931,24 @@ def delete(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsist } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = kwargs.pop("headers", {}) or {} + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} - cls: ClsType[None] = kwargs.pop("cls", None) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.EvaluationRule] = kwargs.pop("cls", None) - _request = build_evaluations_delete_request( - name=name, + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation_rule, (IOBase, bytes)): + _content = evaluation_rule + else: + _content = json.dumps(evaluation_rule, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_rules_create_or_update_request( + id=id, + content_type=content_type, api_version=self._config.api_version, + content=_content, headers=_headers, params=_params, ) @@ -1416,57 +7957,65 @@ def delete(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsist } _request.url = self._client.format_url(_request.url, **path_format_arguments) - _stream = False + _stream = kwargs.pop("stream", False) pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access _request, stream=_stream, **kwargs ) response = pipeline_response.http_response - if response.status_code not in [204]: + if response.status_code not in [200, 201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluationRule, response.json()) if cls: - return cls(pipeline_response, None, response_headers) # type: ignore - - -class DatasetsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`datasets` attribute. - """ + return cls(pipeline_response, deserialized, {}) # type: ignore - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + return deserialized # type: ignore @distributed_trace - def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.DatasetVersion"]: - """List all versions of the given DatasetVersion. - - :param name: The name of the resource. Required. - :type name: str - :return: An iterator like instance of DatasetVersion - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.DatasetVersion] + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "action_type", "agent_name", "enabled", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, + *, + action_type: Optional[Union[str, _models.EvaluationRuleActionType]] = None, + agent_name: Optional[str] = None, + enabled: Optional[bool] = None, + **kwargs: Any + ) -> ItemPaged["_models.EvaluationRule"]: + """List all evaluation rules. + + :keyword action_type: Filter by the type of evaluation rule. Known values are: + "continuousEvaluation" and "humanEvaluation". Default value is None. + :paramtype action_type: str or ~azure.ai.projects.models.EvaluationRuleActionType + :keyword agent_name: Filter by the agent name. Default value is None. + :paramtype agent_name: str + :keyword enabled: Filter by the enabled status. Default value is None. + :paramtype enabled: bool + :return: An iterator like instance of EvaluationRule + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.EvaluationRule] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationRule]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1479,8 +8028,10 @@ def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.DatasetV def prepare_request(next_link=None): if not next_link: - _request = build_datasets_list_versions_request( - name=name, + _request = build_evaluation_rules_list_request( + action_type=action_type, + agent_name=agent_name, + enabled=enabled, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1516,7 +8067,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationRule], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -1538,18 +8089,119 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) + +class EvaluationTaxonomiesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`evaluation_taxonomies` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + @distributed_trace - def list(self, **kwargs: Any) -> ItemPaged["_models.DatasetVersion"]: - """List the latest version of each DatasetVersion. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get(self, name: str, **kwargs: Any) -> _models.EvaluationTaxonomy: + """Get an evaluation run by name. - :return: An iterator like instance of DatasetVersion - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.DatasetVersion] + :param name: The name of the resource. Required. + :type name: str + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) + + _request = build_evaluation_taxonomies_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "input_name", "input_type", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def list( + self, *, input_name: Optional[str] = None, input_type: Optional[str] = None, **kwargs: Any + ) -> ItemPaged["_models.EvaluationTaxonomy"]: + """List evaluation taxonomies. + + :keyword input_name: Filter by the evaluation input name. Default value is None. + :paramtype input_name: str + :keyword input_type: Filter by taxonomy input type. Default value is None. + :paramtype input_type: str + :return: An iterator like instance of EvaluationTaxonomy + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.EvaluationTaxonomy] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.EvaluationTaxonomy]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1562,7 +8214,9 @@ def list(self, **kwargs: Any) -> ItemPaged["_models.DatasetVersion"]: def prepare_request(next_link=None): if not next_link: - _request = build_datasets_list_request( + _request = build_evaluation_taxonomies_list_request( + input_name=input_name, + input_type=input_type, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1598,7 +8252,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationTaxonomy], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -1618,81 +8272,19 @@ def get_next(next_link=None): return pipeline_response - return ItemPaged(get_next, extract_data) - - @distributed_trace - def get(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: - """Get the specific version of the DatasetVersion. The service returns 404 Not Found error if the - DatasetVersion does not exist. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to retrieve. Required. - :type version: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - _request = build_datasets_get_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore + return ItemPaged(get_next, extract_data) @distributed_trace - def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements - """Delete the specific version of the DatasetVersion. The service returns 204 No Content if the - DatasetVersion was deleted successfully or if the DatasetVersion does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete(self, name: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements + """Delete an evaluation taxonomy by name. :param name: The name of the resource. Required. :type name: str - :param version: The version of the DatasetVersion to delete. Required. - :type version: str :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: @@ -1710,9 +8302,8 @@ def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: dis cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_datasets_delete_request( + _request = build_evaluation_taxonomies_delete_request( name=name, - version=version, api_version=self._config.api_version, headers=_headers, params=_params, @@ -1733,102 +8324,86 @@ def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: dis map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + if cls: - return cls(pipeline_response, None, {}) # type: ignore + return cls(pipeline_response, None, response_headers) # type: ignore @overload - def create_or_update( - self, - name: str, - version: str, - dataset_version: _models.DatasetVersion, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + def create( + self, name: str, body: _models.EvaluationTaxonomy, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: ~azure.ai.projects.models.DatasetVersion + :param body: The evaluation taxonomy. Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create_or_update( - self, - name: str, - version: str, - dataset_version: JSON, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + def create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: JSON + :param body: The evaluation taxonomy. Required. + :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create_or_update( - self, - name: str, - version: str, - dataset_version: IO[bytes], - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Required. - :type dataset_version: IO[bytes] + :param body: The evaluation taxonomy. Required. + :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/merge-patch+json". + Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace - def create_or_update( - self, name: str, version: str, dataset_version: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or update an existing DatasetVersion with the given version id. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create( + self, name: str, body: Union[_models.EvaluationTaxonomy, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Create an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or update. Required. - :type version: str - :param dataset_version: The DatasetVersion to create or update. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type dataset_version: ~azure.ai.projects.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetVersion + :param body: The evaluation taxonomy. Is one of the following types: EvaluationTaxonomy, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy or JSON or IO[bytes] + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -1843,18 +8418,17 @@ def create_or_update( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) - content_type = content_type or "application/merge-patch+json" + content_type = content_type or "application/json" _content = None - if isinstance(dataset_version, (IOBase, bytes)): - _content = dataset_version + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(dataset_version, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_create_or_update_request( + _request = build_evaluation_taxonomies_create_request( name=name, - version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1873,7 +8447,7 @@ def create_or_update( response = pipeline_response.http_response - if response.status_code not in [200, 201]: + if response.status_code not in [201]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -1885,7 +8459,7 @@ def create_or_update( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -1893,103 +8467,77 @@ def create_or_update( return deserialized # type: ignore @overload - def pending_upload( - self, - name: str, - version: str, - pending_upload_request: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + def update( + self, name: str, body: _models.EvaluationTaxonomy, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest + :param body: The evaluation taxonomy. Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def pending_upload( - self, - name: str, - version: str, - pending_upload_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + def update( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: JSON + :param body: The evaluation taxonomy. Required. + :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def pending_upload( - self, - name: str, - version: str, - pending_upload_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + def update( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Required. - :type pending_upload_request: IO[bytes] + :param body: The evaluation taxonomy. Required. + :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace - def pending_upload( - self, - name: str, - version: str, - pending_upload_request: Union[_models.PendingUploadRequest, JSON, IO[bytes]], - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Start a new or get an existing pending upload of a dataset for a specific version. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def update( + self, name: str, body: Union[_models.EvaluationTaxonomy, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationTaxonomy: + """Update an evaluation taxonomy. - :param name: The name of the resource. Required. + :param name: The name of the evaluation taxonomy. Required. :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param pending_upload_request: The pending upload request parameters. Is one of the following - types: PendingUploadRequest, JSON, IO[bytes] Required. - :type pending_upload_request: ~azure.ai.projects.models.PendingUploadRequest or JSON or - IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.PendingUploadResponse + :param body: The evaluation taxonomy. Is one of the following types: EvaluationTaxonomy, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.models.EvaluationTaxonomy or JSON or IO[bytes] + :return: EvaluationTaxonomy. The EvaluationTaxonomy is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluationTaxonomy :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2004,18 +8552,17 @@ def pending_upload( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationTaxonomy] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(pending_upload_request, (IOBase, bytes)): - _content = pending_upload_request + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(pending_upload_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_pending_upload_request( + _request = build_evaluation_taxonomies_update_request( name=name, - version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -2046,70 +8593,7 @@ def pending_upload( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @distributed_trace - def get_credentials(self, name: str, version: str, **kwargs: Any) -> _models.DatasetCredential: - """Get the SAS credential to access the storage account associated with a Dataset version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :return: DatasetCredential. The DatasetCredential is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.DatasetCredential - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.DatasetCredential] = kwargs.pop("cls", None) - - _request = build_datasets_get_credentials_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetCredential, response.json()) + deserialized = _deserialize(_models.EvaluationTaxonomy, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -2117,14 +8601,14 @@ def get_credentials(self, name: str, version: str, **kwargs: Any) -> _models.Dat return deserialized # type: ignore -class IndexesOperations: +class EvaluatorsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`indexes` attribute. + :attr:`evaluators` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -2135,19 +8619,38 @@ def __init__(self, *args, **kwargs) -> None: self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.Index"]: - """List all versions of the given Index. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "type", "limit", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_versions( + self, + name: str, + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any + ) -> ItemPaged["_models.EvaluatorVersion"]: + """List all versions of the given evaluator. :param name: The name of the resource. Required. :type name: str - :return: An iterator like instance of Index - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Index] + :keyword type: Filter evaluators by type. Possible values: 'all', 'custom', 'builtin'. Is one + of the following types: Literal["builtin"], Literal["custom"], Literal["all"], str Default + value is None. + :paramtype type: str or str or str or str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the default is 20. Default value is None. + :paramtype limit: int + :return: An iterator like instance of EvaluatorVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.EvaluatorVersion] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluatorVersion]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2160,8 +8663,10 @@ def list_versions(self, name: str, **kwargs: Any) -> ItemPaged["_models.Index"]: def prepare_request(next_link=None): if not next_link: - _request = build_indexes_list_versions_request( + _request = build_evaluators_list_versions_request( name=name, + type=type, + limit=limit, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2197,7 +8702,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluatorVersion], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -2220,17 +8725,35 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @distributed_trace - def list(self, **kwargs: Any) -> ItemPaged["_models.Index"]: - """List the latest version of each Index. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "type", "limit", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_latest_versions( + self, + *, + type: Optional[Union[Literal["builtin"], Literal["custom"], Literal["all"], str]] = None, + limit: Optional[int] = None, + **kwargs: Any + ) -> ItemPaged["_models.EvaluatorVersion"]: + """List the latest version of each evaluator. - :return: An iterator like instance of Index - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Index] + :keyword type: Filter evaluators by type. Possible values: 'all', 'custom', 'builtin'. Is one + of the following types: Literal["builtin"], Literal["custom"], Literal["all"], str Default + value is None. + :paramtype type: str or str or str or str + :keyword limit: A limit on the number of objects to be returned. Limit can range between 1 and + 100, and the default is 20. Default value is None. + :paramtype limit: int + :return: An iterator like instance of EvaluatorVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.EvaluatorVersion] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluatorVersion]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2243,7 +8766,9 @@ def list(self, **kwargs: Any) -> ItemPaged["_models.Index"]: def prepare_request(next_link=None): if not next_link: - _request = build_indexes_list_request( + _request = build_evaluators_list_latest_versions_request( + type=type, + limit=limit, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2279,7 +8804,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluatorVersion], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -2302,16 +8827,21 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @distributed_trace - def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: - """Get the specific version of the Index. The service returns 404 Not Found error if the Index - does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Get the specific version of the EvaluatorVersion. The service returns 404 Not Found error if + the EvaluatorVersion does not exist. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to retrieve. Required. + :param version: The specific version id of the EvaluatorVersion to retrieve. Required. :type version: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2325,9 +8855,9 @@ def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Index] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - _request = build_indexes_get_request( + _request = build_evaluators_get_version_request( name=name, version=version, api_version=self._config.api_version, @@ -2358,7 +8888,7 @@ def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Index, response.json()) + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -2366,13 +8896,20 @@ def get(self, name: str, version: str, **kwargs: Any) -> _models.Index: return deserialized # type: ignore @distributed_trace - def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements - """Delete the specific version of the Index. The service returns 204 No Content if the Index was - deleted successfully or if the Index does not exist. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version"]}, + api_versions_list=["2025-11-15-preview"], + ) + def delete_version( # pylint: disable=inconsistent-return-statements + self, name: str, version: str, **kwargs: Any + ) -> None: + """Delete the specific version of the EvaluatorVersion. The service returns 204 No Content if the + EvaluatorVersion was deleted successfully or if the EvaluatorVersion does not exist. :param name: The name of the resource. Required. :type name: str - :param version: The version of the Index to delete. Required. + :param version: The version of the EvaluatorVersion to delete. Required. :type version: str :return: None :rtype: None @@ -2391,7 +8928,7 @@ def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: dis cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_indexes_delete_request( + _request = build_evaluators_delete_version_request( name=name, version=version, api_version=self._config.api_version, @@ -2417,93 +8954,86 @@ def delete(self, name: str, version: str, **kwargs: Any) -> None: # pylint: dis if cls: return cls(pipeline_response, None, {}) # type: ignore - @overload - def create_or_update( - self, - name: str, - version: str, - index: _models.Index, - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def create_version(self, name: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Create a new EvaluatorVersion with auto incremented version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: ~azure.ai.projects.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) - @overload - def create_or_update( - self, name: str, version: str, index: JSON, *, content_type: str = "application/merge-patch+json", **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - @overload - def create_or_update( - self, - name: str, - version: str, - index: IO[bytes], - *, - content_type: str = "application/merge-patch+json", - **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + _request = build_evaluators_create_version_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or update. Required. - :type version: str - :param index: The Index to create or update. Required. - :type index: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/merge-patch+json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore @distributed_trace - def create_or_update( - self, name: str, version: str, index: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any - ) -> _models.Index: - """Create a new or update an existing Index with the given version id. + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "name", "version", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def update_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluatorVersion: + """Update an existing EvaluatorVersion with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the Index to create or update. Required. + :param version: The version of the EvaluatorVersion to update. Required. :type version: str - :param index: The Index to create or update. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type index: ~azure.ai.projects.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Index + :return: EvaluatorVersion. The EvaluatorVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.EvaluatorVersion :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2514,25 +9044,15 @@ def create_or_update( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/merge-patch+json" - _content = None - if isinstance(index, (IOBase, bytes)): - _content = index - else: - _content = json.dumps(index, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[_models.EvaluatorVersion] = kwargs.pop("cls", None) - _request = build_indexes_create_or_update_request( + _request = build_evaluators_update_version_request( name=name, version=version, - content_type=content_type, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -2548,7 +9068,7 @@ def create_or_update( response = pipeline_response.http_response - if response.status_code not in [200, 201]: + if response.status_code not in [200]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -2560,7 +9080,7 @@ def create_or_update( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Index, response.json()) + deserialized = _deserialize(_models.EvaluatorVersion, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -2568,14 +9088,14 @@ def create_or_update( return deserialized # type: ignore -class DeploymentsOperations: +class InsightsOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`deployments` attribute. + :attr:`insights` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -2585,14 +9105,154 @@ def __init__(self, *args, **kwargs) -> None: self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + @overload + def generate( + self, insight: _models.Insight, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: ~azure.ai.projects.models.Insight + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def generate(self, insight: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def generate(self, insight: IO[bytes], *, content_type: str = "application/json", **kwargs: Any) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Required. + :type insight: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "repeatability_request_id", + "repeatability_first_sent", + "content_type", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) + def generate(self, insight: Union[_models.Insight, JSON, IO[bytes]], **kwargs: Any) -> _models.Insight: + """Generate Insights. + + :param insight: Complete evaluation configuration including data source, evaluators, and result + settings. Is one of the following types: Insight, JSON, IO[bytes] Required. + :type insight: ~azure.ai.projects.models.Insight or JSON or IO[bytes] + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Insight] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(insight, (IOBase, bytes)): + _content = insight + else: + _content = json.dumps(insight, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_insights_generate_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Insight, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + @distributed_trace - def get(self, name: str, **kwargs: Any) -> _models.Deployment: - """Get a deployed model. - - :param name: Name of the deployment. Required. - :type name: str - :return: Deployment. The Deployment is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.Deployment + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": ["api_version", "id", "include_coordinates", "client_request_id", "accept"] + }, + api_versions_list=["2025-11-15-preview"], + ) + def get(self, id: str, *, include_coordinates: Optional[bool] = None, **kwargs: Any) -> _models.Insight: + """Get a specific insight by Id. + + :param id: The unique identifier for the insights report. Required. + :type id: str + :keyword include_coordinates: Whether to include coordinates for visualization in the response. + Defaults to false. Default value is None. + :paramtype include_coordinates: bool + :return: Insight. The Insight is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Insight :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2606,10 +9266,11 @@ def get(self, name: str, **kwargs: Any) -> _models.Deployment: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) + cls: ClsType[_models.Insight] = kwargs.pop("cls", None) - _request = build_deployments_get_request( - name=name, + _request = build_insights_get_request( + id=id, + include_coordinates=include_coordinates, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2643,7 +9304,7 @@ def get(self, name: str, **kwargs: Any) -> _models.Deployment: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.Deployment, response.json()) + deserialized = _deserialize(_models.Insight, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -2651,32 +9312,54 @@ def get(self, name: str, **kwargs: Any) -> _models.Deployment: return deserialized # type: ignore @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={ + "2025-11-15-preview": [ + "api_version", + "type", + "eval_id", + "run_id", + "agent_name", + "include_coordinates", + "client_request_id", + "accept", + ] + }, + api_versions_list=["2025-11-15-preview"], + ) def list( self, *, - model_publisher: Optional[str] = None, - model_name: Optional[str] = None, - deployment_type: Optional[Union[str, _models.DeploymentType]] = None, + type: Optional[Union[str, _models.InsightType]] = None, + eval_id: Optional[str] = None, + run_id: Optional[str] = None, + agent_name: Optional[str] = None, + include_coordinates: Optional[bool] = None, **kwargs: Any - ) -> ItemPaged["_models.Deployment"]: - """List all deployed models in the project. - - :keyword model_publisher: Model publisher to filter models by. Default value is None. - :paramtype model_publisher: str - :keyword model_name: Model name (the publisher specific name) to filter models by. Default - value is None. - :paramtype model_name: str - :keyword deployment_type: Type of deployment to filter list by. "ModelDeployment" Default value - is None. - :paramtype deployment_type: str or ~azure.ai.projects.models.DeploymentType - :return: An iterator like instance of Deployment - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Deployment] + ) -> ItemPaged["_models.Insight"]: + """List all insights in reverse chronological order (newest first). + + :keyword type: Filter by the type of analysis. Known values are: "EvaluationRunClusterInsight", + "AgentClusterInsight", and "EvaluationComparison". Default value is None. + :paramtype type: str or ~azure.ai.projects.models.InsightType + :keyword eval_id: Filter by the evaluation ID. Default value is None. + :paramtype eval_id: str + :keyword run_id: Filter by the evaluation run ID. Default value is None. + :paramtype run_id: str + :keyword agent_name: Filter by the agent name. Default value is None. + :paramtype agent_name: str + :keyword include_coordinates: Whether to include coordinates for visualization in the response. + Defaults to false. Default value is None. + :paramtype include_coordinates: bool + :return: An iterator like instance of Insight + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Insight] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Insight]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2689,10 +9372,12 @@ def list( def prepare_request(next_link=None): if not next_link: - _request = build_deployments_list_request( - model_publisher=model_publisher, - model_name=model_name, - deployment_type=deployment_type, + _request = build_insights_list_request( + type=type, + eval_id=eval_id, + run_id=run_id, + agent_name=agent_name, + include_coordinates=include_coordinates, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2728,7 +9413,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Insight], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -2751,14 +9436,14 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) -class RedTeamsOperations: +class SchedulesOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.AIProjectClient`'s - :attr:`red_teams` attribute. + :attr:`schedules` attribute. """ def __init__(self, *args, **kwargs) -> None: @@ -2770,17 +9455,17 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id"]}, + api_versions_list=["2025-11-15-preview"], ) - def get(self, name: str, **kwargs: Any) -> _models.RedTeam: - """Get a redteam by name. + def delete(self, id: str, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements + """Delete a schedule. - :param name: Identifier of the red team run. Required. - :type name: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :param id: Identifier of the schedule. Required. + :type id: str + :return: None + :rtype: None :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2794,10 +9479,68 @@ def get(self, name: str, **kwargs: Any) -> _models.RedTeam: _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_red_teams_get_request( - name=name, + _request = build_schedules_delete_request( + id=id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if cls: + return cls(pipeline_response, None, response_headers) # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get(self, id: str, **kwargs: Any) -> _models.Schedule: + """Get a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Schedule] = kwargs.pop("cls", None) + + _request = build_schedules_get_request( + id=id, api_version=self._config.api_version, headers=_headers, params=_params, @@ -2831,7 +9574,7 @@ def get(self, name: str, **kwargs: Any) -> _models.RedTeam: if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.RedTeam, response.json()) + deserialized = _deserialize(_models.Schedule, response.json()) if cls: return cls(pipeline_response, deserialized, response_headers) # type: ignore @@ -2840,21 +9583,21 @@ def get(self, name: str, **kwargs: Any) -> _models.RedTeam: @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "client_request_id", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "client_request_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - def list(self, **kwargs: Any) -> ItemPaged["_models.RedTeam"]: - """List a redteam by name. + def list(self, **kwargs: Any) -> ItemPaged["_models.Schedule"]: + """List all schedules. - :return: An iterator like instance of RedTeam - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.RedTeam] + :return: An iterator like instance of Schedule + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.models.Schedule] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Schedule]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -2867,7 +9610,7 @@ def list(self, **kwargs: Any) -> ItemPaged["_models.RedTeam"]: def prepare_request(next_link=None): if not next_link: - _request = build_red_teams_list_request( + _request = build_schedules_list_request( api_version=self._config.api_version, headers=_headers, params=_params, @@ -2903,7 +9646,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Schedule], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -2926,63 +9669,77 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @overload - def create( - self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: ~azure.ai.projects.models.RedTeam + def create_or_update( + self, id: str, schedule: _models.Schedule, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: ~azure.ai.projects.models.Schedule :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create(self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: JSON + def create_or_update( + self, id: str, schedule: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create(self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: - """Creates a redteam run. - - :param red_team: Redteam to be run. Required. - :type red_team: IO[bytes] + def create_or_update( + self, id: str, schedule: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. + + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Required. + :type schedule: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - api_versions_list=["2025-05-15-preview"], + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "id", "content_type", "accept"]}, + api_versions_list=["2025-11-15-preview"], ) - def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: - """Creates a redteam run. + def create_or_update( + self, id: str, schedule: Union[_models.Schedule, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Schedule: + """Create or update a schedule by id. - :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + :param id: Identifier of the schedule. Required. + :type id: str + :param schedule: Schedule resource. Is one of the following types: Schedule, JSON, IO[bytes] Required. - :type red_team: ~azure.ai.projects.models.RedTeam or JSON or IO[bytes] - :return: RedTeam. The RedTeam is compatible with MutableMapping - :rtype: ~azure.ai.projects.models.RedTeam + :type schedule: ~azure.ai.projects.models.Schedule or JSON or IO[bytes] + :return: Schedule. The Schedule is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.Schedule :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2997,16 +9754,17 @@ def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: An _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + cls: ClsType[_models.Schedule] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None - if isinstance(red_team, (IOBase, bytes)): - _content = red_team + if isinstance(schedule, (IOBase, bytes)): + _content = schedule else: - _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(schedule, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_red_teams_create_request( + _request = build_schedules_create_or_update_request( + id=id, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -3025,7 +9783,7 @@ def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: An response = pipeline_response.http_response - if response.status_code not in [201]: + if response.status_code not in [200, 201]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -3037,7 +9795,140 @@ def create(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: An if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.RedTeam, response.json()) + deserialized = _deserialize(_models.Schedule, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "schedule_id", "run_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def get_run(self, schedule_id: str, run_id: str, **kwargs: Any) -> _models.ScheduleRun: + """Get a schedule run by id. + + :param schedule_id: Identifier of the schedule. Required. + :type schedule_id: str + :param run_id: Identifier of the schedule run. Required. + :type run_id: str + :return: ScheduleRun. The ScheduleRun is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.ScheduleRun + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.ScheduleRun] = kwargs.pop("cls", None) + + _request = build_schedules_get_run_request( + schedule_id=schedule_id, + run_id=run_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.ScheduleRun, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-11-15-preview", + params_added_on={"2025-11-15-preview": ["api_version", "schedule_id", "accept"]}, + api_versions_list=["2025-11-15-preview"], + ) + def list_runs(self, schedule_id: str, **kwargs: Any) -> _models.PagedScheduleRun: + """List all schedule runs. + + :param schedule_id: Identifier of the schedule. Required. + :type schedule_id: str + :return: PagedScheduleRun. The PagedScheduleRun is compatible with MutableMapping + :rtype: ~azure.ai.projects.models.PagedScheduleRun + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.PagedScheduleRun] = kwargs.pop("cls", None) + + _request = build_schedules_list_runs_request( + schedule_id=schedule_id, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PagedScheduleRun, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/__init__.py b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/__init__.py new file mode 100644 index 000000000000..a033e8bb0a2d --- /dev/null +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/__init__.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from ._ai_project_instrumentor import AIProjectInstrumentor +from ._trace_function import trace_function + + +__all__ = ["AIProjectInstrumentor", "trace_function"] diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_ai_project_instrumentor.py b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_ai_project_instrumentor.py new file mode 100644 index 000000000000..2bbfac7f3856 --- /dev/null +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_ai_project_instrumentor.py @@ -0,0 +1,1068 @@ +# pylint: disable=too-many-lines,line-too-long,useless-suppression,too-many-nested-blocks,docstring-missing-param,docstring-should-be-keyword +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import copy +import functools +import importlib +import json +import logging +import os +from datetime import datetime +from enum import Enum +from typing import Any, Callable, Dict, List, Optional, Tuple, Union, TYPE_CHECKING +from urllib.parse import urlparse +from azure.ai.projects.models._models import ( + Tool, + ItemResource, +) +from azure.core import CaseInsensitiveEnumMeta # type: ignore +from azure.core.settings import settings +from azure.core.tracing import AbstractSpan +from ._utils import ( + AZ_AI_AGENT_SYSTEM, + ERROR_TYPE, + GEN_AI_AGENT_DESCRIPTION, + GEN_AI_AGENT_ID, + GEN_AI_AGENT_NAME, + GEN_AI_EVENT_CONTENT, + GEN_AI_MESSAGE_ID, + GEN_AI_MESSAGE_STATUS, + GEN_AI_SYSTEM, + GEN_AI_SYSTEM_MESSAGE, + GEN_AI_THREAD_ID, + GEN_AI_THREAD_RUN_ID, + GEN_AI_USAGE_INPUT_TOKENS, + GEN_AI_USAGE_OUTPUT_TOKENS, + GEN_AI_RUN_STEP_START_TIMESTAMP, + GEN_AI_RUN_STEP_END_TIMESTAMP, + GEN_AI_RUN_STEP_STATUS, + GEN_AI_AGENT_VERSION, + ERROR_MESSAGE, + OperationName, + start_span, +) + + +_Unset: Any = object() + +logger = logging.getLogger(__name__) + +try: + # pylint: disable = no-name-in-module + from opentelemetry.trace import Span, StatusCode + + _tracing_library_available = True +except ModuleNotFoundError: + _tracing_library_available = False + +if TYPE_CHECKING: + from .. import _types + +__all__ = [ + "AIProjectInstrumentor", +] + +_agents_traces_enabled: bool = False +_trace_agents_content: bool = False + + +class TraceType(str, Enum, metaclass=CaseInsensitiveEnumMeta): # pylint: disable=C4747 + """An enumeration class to represent different types of traces.""" + + AGENTS = "Agents" + + +class AIProjectInstrumentor: + """ + A class for managing the trace instrumentation of the AIProjectClient. + + This class allows enabling or disabling tracing for AI Projects. + and provides functionality to check whether instrumentation is active. + + """ + + def __init__(self): + if not _tracing_library_available: + raise ModuleNotFoundError( + "Azure Core Tracing Opentelemetry is not installed. " + "Please install it using 'pip install azure-core-tracing-opentelemetry'" + ) + # We could support different semantic convention versions from the same library + # and have a parameter that specifies the version to use. + self._impl = _AIAgentsInstrumentorPreview() + + def instrument(self, enable_content_recording: Optional[bool] = None) -> None: + """ + Enable trace instrumentation for AIProjectClient. + + :param enable_content_recording: Whether content recording is enabled as part + of the traces or not. Content in this context refers to chat message content + and function call tool related function names, function parameter names and + values. `True` will enable content recording, `False` will disable it. If no value + is provided, then the value read from environment variable + OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT is used. If the environment + variable is not found, then the value will default to `False`. + Please note that successive calls to instrument will always apply the content + recording value provided with the most recent call to instrument (including + applying the environment variable if no value is provided and defaulting to `False` + if the environment variable is not found), even if instrument was already previously + called without uninstrument being called in between the instrument calls. + :type enable_content_recording: bool, optional + + """ + self._impl.instrument(enable_content_recording) + + def uninstrument(self) -> None: + """ + Remove trace instrumentation for AIProjectClient. + + This method removes any active instrumentation, stopping the tracing + of AIProjectClient methods. + """ + self._impl.uninstrument() + + def is_instrumented(self) -> bool: + """ + Check if trace instrumentation for AIProjectClient is currently enabled. + + :return: True if instrumentation is active, False otherwise. + :rtype: bool + """ + return self._impl.is_instrumented() + + def is_content_recording_enabled(self) -> bool: + """This function gets the content recording value. + + :return: A bool value indicating whether content recording is enabled. + :rtype: bool + """ + return self._impl.is_content_recording_enabled() + + +class _AIAgentsInstrumentorPreview: + # pylint: disable=R0904 + """ + A class for managing the trace instrumentation of AI Agents. + + This class allows enabling or disabling tracing for AI Agents. + and provides functionality to check whether instrumentation is active. + """ + + def _str_to_bool(self, s): + if s is None: + return False + return str(s).lower() == "true" + + def instrument(self, enable_content_recording: Optional[bool] = None): + """ + Enable trace instrumentation for AI Agents. + + :param enable_content_recording: Whether content recording is enabled as part + of the traces or not. Content in this context refers to chat message content + and function call tool related function names, function parameter names and + values. `True` will enable content recording, `False` will disable it. If no value + is provided, then the value read from environment variable + OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT is used. If the environment + variable is not found, then the value will default to `False`. + Please note that successive calls to instrument will always apply the content + recording value provided with the most recent call to instrument (including + applying the environment variable if no value is provided and defaulting to `False` + if the environment variable is not found), even if instrument was already previously + called without uninstrument being called in between the instrument calls. + :type enable_content_recording: bool, optional + + """ + if enable_content_recording is None: + + var_value = os.environ.get("OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT") + enable_content_recording = self._str_to_bool(var_value) + + if not self.is_instrumented(): + self._instrument_agents(enable_content_recording) + else: + self._set_enable_content_recording(enable_content_recording=enable_content_recording) + + def uninstrument(self): + """ + Disable trace instrumentation for AI Agents. + + This method removes any active instrumentation, stopping the tracing + of AI Agents. + """ + if self.is_instrumented(): + self._uninstrument_agents() + + def is_instrumented(self): + """ + Check if trace instrumentation for AI Agents is currently enabled. + + :return: True if instrumentation is active, False otherwise. + :rtype: bool + """ + return self._is_instrumented() + + def set_enable_content_recording(self, enable_content_recording: bool = False) -> None: + """This function sets the content recording value. + + :param enable_content_recording: Indicates whether tracing of message content should be enabled. + This also controls whether function call tool function names, + parameter names and parameter values are traced. + :type enable_content_recording: bool + """ + self._set_enable_content_recording(enable_content_recording=enable_content_recording) + + def is_content_recording_enabled(self) -> bool: + """This function gets the content recording value. + + :return: A bool value indicating whether content tracing is enabled. + :rtype bool + """ + return self._is_content_recording_enabled() + + def _set_attributes(self, span: "AbstractSpan", *attrs: Tuple[str, Any]) -> None: + for attr in attrs: + key, value = attr + if value is not None: + span.add_attribute(key, value) + + def _parse_url(self, url): + parsed = urlparse(url) + server_address = parsed.hostname + port = parsed.port + return server_address, port + + def _remove_function_call_names_and_arguments(self, tool_calls: list) -> list: + tool_calls_copy = copy.deepcopy(tool_calls) + for tool_call in tool_calls_copy: + if "function" in tool_call: + if "name" in tool_call["function"]: + del tool_call["function"]["name"] + if "arguments" in tool_call["function"]: + del tool_call["function"]["arguments"] + if not tool_call["function"]: + del tool_call["function"] + return tool_calls_copy + + def _create_event_attributes( + self, + thread_id: Optional[str] = None, + agent_id: Optional[str] = None, + thread_run_id: Optional[str] = None, + message_id: Optional[str] = None, + message_status: Optional[str] = None, + run_step_status: Optional[str] = None, + created_at: Optional[datetime] = None, + completed_at: Optional[datetime] = None, + cancelled_at: Optional[datetime] = None, + failed_at: Optional[datetime] = None, + run_step_last_error: Optional[Any] = None, + usage: Optional[Any] = None, + ) -> Dict[str, Any]: + attrs: Dict[str, Any] = {GEN_AI_SYSTEM: AZ_AI_AGENT_SYSTEM} + if thread_id: + attrs[GEN_AI_THREAD_ID] = thread_id + + if agent_id: + attrs[GEN_AI_AGENT_ID] = agent_id + + if thread_run_id: + attrs[GEN_AI_THREAD_RUN_ID] = thread_run_id + + if message_id: + attrs[GEN_AI_MESSAGE_ID] = message_id + + if message_status: + attrs[GEN_AI_MESSAGE_STATUS] = self._status_to_string(message_status) + + if run_step_status: + attrs[GEN_AI_RUN_STEP_STATUS] = self._status_to_string(run_step_status) + + if created_at: + if isinstance(created_at, datetime): + attrs[GEN_AI_RUN_STEP_START_TIMESTAMP] = created_at.isoformat() + else: + # fallback in case integer or string gets passed + attrs[GEN_AI_RUN_STEP_START_TIMESTAMP] = str(created_at) + + end_timestamp = None + if completed_at: + end_timestamp = completed_at + elif cancelled_at: + end_timestamp = cancelled_at + elif failed_at: + end_timestamp = failed_at + + if isinstance(end_timestamp, datetime): + attrs[GEN_AI_RUN_STEP_END_TIMESTAMP] = end_timestamp.isoformat() + elif end_timestamp: + # fallback in case int or string gets passed + attrs[GEN_AI_RUN_STEP_END_TIMESTAMP] = str(end_timestamp) + + if run_step_last_error: + attrs[ERROR_MESSAGE] = run_step_last_error.message + attrs[ERROR_TYPE] = run_step_last_error.code + + if usage: + attrs[GEN_AI_USAGE_INPUT_TOKENS] = usage.prompt_tokens + attrs[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.completion_tokens + + return attrs + + def add_thread_message_event( + self, + span, + message: Any, + usage: Optional[Any] = None, + ) -> None: + + content_body: Optional[Union[str, Dict[str, Any]]] = None + if _trace_agents_content: + # Handle processed dictionary messages + if isinstance(message, dict): + content = message.get("content") + if content: + content_body = content + + role = "unknown" + if isinstance(message, dict): + role = message.get("role", "unknown") + elif hasattr(message, "role"): + role = getattr(message, "role", "unknown") + + self._add_message_event( + span, + role, + content_body, + attachments=( + message.get("attachments") if isinstance(message, dict) else getattr(message, "attachments", None) + ), + thread_id=message.get("thread_id") if isinstance(message, dict) else getattr(message, "thread_id", None), + agent_id=message.get("agent_id") if isinstance(message, dict) else getattr(message, "agent_id", None), + message_id=message.get("id") if isinstance(message, dict) else getattr(message, "id", None), + thread_run_id=message.get("run_id") if isinstance(message, dict) else getattr(message, "run_id", None), + message_status=message.get("status") if isinstance(message, dict) else getattr(message, "status", None), + incomplete_details=( + message.get("incomplete_details") + if isinstance(message, dict) + else getattr(message, "incomplete_details", None) + ), + usage=usage, + ) + + def _add_message_event( + self, + span, + role: str, + content: Optional[Union[str, dict[str, Any], List[dict[str, Any]]]] = None, + attachments: Any = None, + thread_id: Optional[str] = None, + agent_id: Optional[str] = None, + message_id: Optional[str] = None, + thread_run_id: Optional[str] = None, + message_status: Optional[str] = None, + incomplete_details: Optional[Any] = None, + usage: Optional[Any] = None, + ) -> None: + # TODO document new fields + + event_body: dict[str, Any] = {} + if _trace_agents_content: + if isinstance(content, List): + for block in content: + if isinstance(block, Dict): + if block.get("type") == "input_text" and "text" in block: + event_body["content"] = block["text"] + break + else: + event_body["content"] = content + if attachments: + event_body["attachments"] = [] + for attachment in attachments: + attachment_body = {"id": attachment.file_id} + if attachment.tools: + attachment_body["tools"] = [self._get_field(tool, "type") for tool in attachment.tools] + event_body["attachments"].append(attachment_body) + + if incomplete_details: + event_body["incomplete_details"] = incomplete_details + event_body["role"] = role + + attributes = self._create_event_attributes( + thread_id=thread_id, + agent_id=agent_id, + thread_run_id=thread_run_id, + message_id=message_id, + message_status=message_status, + usage=usage, + ) + attributes[GEN_AI_EVENT_CONTENT] = json.dumps(event_body, ensure_ascii=False) + + event_name = None + if role == "user": + event_name = "gen_ai.input.message" + elif role == "system": + event_name = "gen_ai.system_instruction" + else: + event_name = "gen_ai.input.message" + + # span.span_instance.add_event(name=f"gen_ai.{role}.message", attributes=attributes) + span.span_instance.add_event(name=event_name, attributes=attributes) + + def _get_field(self, obj: Any, field: str) -> Any: + if not obj: + return None + + if isinstance(obj, dict): + return obj.get(field, None) + + return getattr(obj, field, None) + + def _add_instructions_event( + self, + span: "AbstractSpan", + instructions: Optional[str], + additional_instructions: Optional[str], + agent_id: Optional[str] = None, + thread_id: Optional[str] = None, + ) -> None: + if not instructions: + return + + event_body: Dict[str, Any] = {} + if _trace_agents_content and (instructions or additional_instructions): + if instructions and additional_instructions: + event_body["content"] = f"{instructions} {additional_instructions}" + else: + event_body["content"] = instructions or additional_instructions + + attributes = self._create_event_attributes(agent_id=agent_id, thread_id=thread_id) + attributes[GEN_AI_EVENT_CONTENT] = json.dumps(event_body, ensure_ascii=False) + span.span_instance.add_event(name=GEN_AI_SYSTEM_MESSAGE, attributes=attributes) + + def _status_to_string(self, status: Any) -> str: + return status.value if hasattr(status, "value") else status + + @staticmethod + def agent_api_response_to_str(response_format: Any) -> Optional[str]: + """ + Convert response_format to string. + + :param response_format: The response format. + :type response_format: Any + :returns: string for the response_format. + :rtype: Optional[str] + :raises: Value error if response_format is not a supported type. + """ + if isinstance(response_format, str) or response_format is None: + return response_format + raise ValueError(f"Unknown response format {type(response_format)}") + + def start_create_agent_span( # pylint: disable=too-many-locals + self, + server_address: Optional[str] = None, + port: Optional[int] = None, + model: Optional[str] = None, + name: Optional[str] = None, + description: Optional[str] = None, + instructions: Optional[str] = None, + _tools: Optional[List[Tool]] = None, + _tool_resources: Optional[ItemResource] = None, + # _toolset: Optional["ToolSet"] = None, + temperature: Optional[float] = None, + top_p: Optional[float] = None, + response_format: Optional[Any] = None, + reasoning_effort: Optional[str] = None, + reasoning_summary: Optional[str] = None, + text: Optional[Any] = None, # pylint: disable=unused-argument + structured_inputs: Optional[Any] = None, + ) -> "Optional[AbstractSpan]": + span = start_span( + OperationName.CREATE_AGENT, + server_address=server_address, + port=port, + span_name=f"{OperationName.CREATE_AGENT.value} {name}", + model=model, + temperature=temperature, + top_p=top_p, + response_format=_AIAgentsInstrumentorPreview.agent_api_response_to_str(response_format), + reasoning_effort=reasoning_effort, + reasoning_summary=reasoning_summary, + structured_inputs=str(structured_inputs) if structured_inputs is not None else None, + ) + if span and span.span_instance.is_recording: + if name: + span.add_attribute(GEN_AI_AGENT_NAME, name) + if description: + span.add_attribute(GEN_AI_AGENT_DESCRIPTION, description) + self._add_instructions_event(span, instructions, None) + + return span + + def start_create_thread_span( + self, + server_address: Optional[str] = None, + port: Optional[int] = None, + messages: Optional[List[Dict[str, str]]] = None, + # _tool_resources: Optional["ToolResources"] = None, + ) -> "Optional[AbstractSpan]": + span = start_span(OperationName.CREATE_THREAD, server_address=server_address, port=port) + if span and span.span_instance.is_recording: + for message in messages or []: + self.add_thread_message_event(span, message) + + return span + + def get_server_address_from_arg(self, arg: Any) -> Optional[Tuple[str, Optional[int]]]: + """ + Extracts the base endpoint and port from the provided arguments _config.endpoint attribute, if that exists. + + :param arg: The argument from which the server address is to be extracted. + :type arg: Any + :return: A tuple of (base endpoint, port) or None if endpoint is not found. + :rtype: Optional[Tuple[str, Optional[int]]] + """ + if hasattr(arg, "_config") and hasattr( + arg._config, # pylint: disable=protected-access # pyright: ignore [reportFunctionMemberAccess] + "endpoint", + ): + endpoint = ( + arg._config.endpoint # pylint: disable=protected-access # pyright: ignore [reportFunctionMemberAccess] + ) + parsed_url = urlparse(endpoint) + return f"{parsed_url.scheme}://{parsed_url.netloc}", parsed_url.port + return None + + def _create_agent_span_from_parameters( + self, *args, **kwargs + ): # pylint: disable=too-many-statements,too-many-locals,docstring-missing-param + """Extract parameters and create span for create_agent tracing.""" + server_address_info = self.get_server_address_from_arg(args[0]) + server_address = server_address_info[0] if server_address_info else None + port = server_address_info[1] if server_address_info else None + + # Extract parameters from the new nested structure + agent_name = kwargs.get("agent_name") + definition = kwargs.get("definition", {}) + if definition is None: + body = kwargs.get("body", {}) + definition = body.get("definition", {}) + + # Extract parameters from definition + model = definition.get("model") + instructions = definition.get("instructions") + temperature = definition.get("temperature") + top_p = definition.get("top_p") + tools = definition.get("tools") + reasoning = definition.get("reasoning") + text = definition.get("text") + structured_inputs = None + description = definition.get("description") + tool_resources = definition.get("tool_resources") + # toolset = definition.get("toolset") + + # Extract reasoning effort and summary from reasoning if available + reasoning_effort = None + reasoning_summary = None + if reasoning: + # Handle different types of reasoning objects + if hasattr(reasoning, "effort") and hasattr(reasoning, "summary"): + # Azure OpenAI Reasoning model object + reasoning_effort = getattr(reasoning, "effort", None) + reasoning_summary = getattr(reasoning, "summary", None) + elif isinstance(reasoning, dict): + # Dictionary format + reasoning_effort = reasoning.get("effort") + reasoning_summary = reasoning.get("summary") + elif isinstance(reasoning, str): + # Try to parse as JSON if it's a string + try: + reasoning_dict = json.loads(reasoning) + if isinstance(reasoning_dict, dict): + reasoning_effort = reasoning_dict.get("effort") + reasoning_summary = reasoning_dict.get("summary") + except (json.JSONDecodeError, ValueError): + # If parsing fails, treat the whole string as effort + reasoning_effort = reasoning + + # Extract response format from text.format if available + response_format = None + if text: + # Handle different types of text objects + if hasattr(text, "format"): + # Azure AI Agents PromptAgentDefinitionText model object + format_info = getattr(text, "format", None) + if format_info: + if hasattr(format_info, "type"): + # Format is also a model object + response_format = getattr(format_info, "type", None) + elif isinstance(format_info, dict): + # Format is a dictionary + response_format = format_info.get("type") + elif isinstance(text, dict): + # Dictionary format + format_info = text.get("format") + if format_info and isinstance(format_info, dict): + format_type = format_info.get("type") + if format_type: + response_format = format_type + elif isinstance(text, str): + # Try to parse as JSON if it's a string + try: + text_dict = json.loads(text) + if isinstance(text_dict, dict): + format_info = text_dict.get("format") + if format_info and isinstance(format_info, dict): + format_type = format_info.get("type") + if format_type: + response_format = format_type + except (json.JSONDecodeError, ValueError): + # If parsing fails, ignore + pass + + # Create and return the span + return self.start_create_agent_span( + server_address=server_address, + port=port, + name=agent_name, + model=model, + description=description, + instructions=instructions, + _tools=tools, + _tool_resources=tool_resources, + temperature=temperature, + top_p=top_p, + response_format=response_format, + reasoning_effort=reasoning_effort, + reasoning_summary=reasoning_summary, + text=text, + structured_inputs=structured_inputs, + ) + + def trace_create_agent(self, function, *args, **kwargs): + span = self._create_agent_span_from_parameters(*args, **kwargs) + + if span is None: + return function(*args, **kwargs) + + with span: + try: + result = function(*args, **kwargs) + span.add_attribute(GEN_AI_AGENT_ID, result.id) + span.add_attribute(GEN_AI_AGENT_VERSION, result.version) + except Exception as exc: + self.record_error(span, exc) + raise + + return result + + async def trace_create_agent_async(self, function, *args, **kwargs): + span = self._create_agent_span_from_parameters(*args, **kwargs) + + if span is None: + return await function(*args, **kwargs) + + with span: + try: + result = await function(*args, **kwargs) + span.add_attribute(GEN_AI_AGENT_ID, result.id) + span.add_attribute(GEN_AI_AGENT_VERSION, result.version) + except Exception as exc: + self.record_error(span, exc) + raise + + return result + + def _create_thread_span_from_parameters(self, *args, **kwargs): + """Extract parameters, process messages, and create span for create_thread tracing.""" + server_address_info = self.get_server_address_from_arg(args[0]) + server_address = server_address_info[0] if server_address_info else None + port = server_address_info[1] if server_address_info else None + messages = kwargs.get("messages") + items = kwargs.get("items") + if items is None: + body = kwargs.get("body") + if isinstance(body, dict): + items = body.get("items") + + # Process items if available to extract content from generators + processed_messages = messages + if items: + processed_messages = [] + for item in items: + # Handle model objects like ResponsesUserMessageItemParam, ResponsesSystemMessageItemParam + if hasattr(item, "__dict__"): + final_content = str(getattr(item, "content", "")) + # Create message structure for telemetry + role = getattr(item, "role", "unknown") + processed_messages.append({"role": role, "content": final_content}) + else: + # Handle dict items or simple string items + if isinstance(item, dict): + processed_messages.append(item) + else: + # Handle simple string items + processed_messages.append({"role": "unknown", "content": str(item)}) + + # Create and return the span + return self.start_create_thread_span(server_address=server_address, port=port, messages=processed_messages) + + def trace_create_thread(self, function, *args, **kwargs): + span = self._create_thread_span_from_parameters(*args, **kwargs) + + if span is None: + return function(*args, **kwargs) + + with span: + try: + result = function(*args, **kwargs) + span.add_attribute(GEN_AI_THREAD_ID, result.get("id")) + except Exception as exc: + self.record_error(span, exc) + raise + + return result + + async def trace_create_thread_async(self, function, *args, **kwargs): + span = self._create_thread_span_from_parameters(*args, **kwargs) + + if span is None: + return await function(*args, **kwargs) + + with span: + try: + result = await function(*args, **kwargs) + span.add_attribute(GEN_AI_THREAD_ID, result.get("id")) + except Exception as exc: + self.record_error(span, exc) + raise + + return result + + def trace_list_messages_async(self, function, *args, **kwargs): + """Placeholder method for list messages async tracing. + + The full instrumentation infrastructure for list operations + is not yet implemented, so we simply call the original function. + + :param function: The original function to be called. + :type function: Callable + :param args: Positional arguments passed to the original function. + :type args: tuple + :param kwargs: Keyword arguments passed to the original function. + :type kwargs: dict + :return: The result of calling the original function. + :rtype: Any + """ + return function(*args, **kwargs) + + def trace_list_run_steps_async(self, function, *args, **kwargs): + """Placeholder method for list run steps async tracing. + + The full instrumentation infrastructure for list operations + is not yet implemented, so we simply call the original function. + + :param function: The original function to be called. + :type function: Callable + :param args: Positional arguments passed to the original function. + :type args: tuple + :param kwargs: Keyword arguments passed to the original function. + :type kwargs: dict + :return: The result of calling the original function. + :rtype: Any + """ + return function(*args, **kwargs) + + def _trace_sync_function( + self, + function: Callable, + *, + _args_to_ignore: Optional[List[str]] = None, + _trace_type=TraceType.AGENTS, + _name: Optional[str] = None, + ) -> Callable: + """ + Decorator that adds tracing to a synchronous function. + + :param function: The function to be traced. + :type function: Callable + :param args_to_ignore: A list of argument names to be ignored in the trace. Defaults to None. + :type: args_to_ignore: [List[str]], optional + :param trace_type: The type of the trace. Defaults to TraceType.AGENTS. + :type trace_type: TraceType, optional + :param name: The name of the trace, will set to func name if not provided. + :type name: str, optional + :return: The traced function. + :rtype: Callable + """ + + @functools.wraps(function) + def inner(*args, **kwargs): # pylint: disable=R0911 + span_impl_type = settings.tracing_implementation() # pylint: disable=E1102 + if span_impl_type is None: + return function(*args, **kwargs) + + class_function_name = function.__qualname__ + + if class_function_name.endswith(".create_version") and ("AgentsOperations" in class_function_name): + kwargs.setdefault("merge_span", True) + return self.trace_create_agent(function, *args, **kwargs) + # if class_function_name.startswith("ConversationsOperations.create"): + # kwargs.setdefault("merge_span", True) + # return self.trace_create_thread(function, *args, **kwargs) + return function(*args, **kwargs) # Ensure all paths return + + return inner + + def _trace_async_function( + self, + function: Callable, + *, + _args_to_ignore: Optional[List[str]] = None, + _trace_type=TraceType.AGENTS, + _name: Optional[str] = None, + ) -> Callable: + """ + Decorator that adds tracing to an asynchronous function. + + :param function: The function to be traced. + :type function: Callable + :param args_to_ignore: A list of argument names to be ignored in the trace. Defaults to None. + :type: args_to_ignore: [List[str]], optional + :param trace_type: The type of the trace. Defaults to TraceType.AGENTS. + :type trace_type: TraceType, optional + :param name: The name of the trace, will set to func name if not provided. + :type name: str, optional + :return: The traced function. + :rtype: Callable + """ + + @functools.wraps(function) + async def inner(*args, **kwargs): # pylint: disable=R0911 + span_impl_type = settings.tracing_implementation() # pylint: disable=E1102 + if span_impl_type is None: + return await function(*args, **kwargs) + + class_function_name = function.__qualname__ + + if class_function_name.endswith(".create_version") and ("AgentsOperations" in class_function_name): + kwargs.setdefault("merge_span", True) + return await self.trace_create_agent_async(function, *args, **kwargs) + # if class_function_name.startswith("ConversationOperations.create"): + # kwargs.setdefault("merge_span", True) + # return await self.trace_create_thread_async(function, *args, **kwargs) + return await function(*args, **kwargs) # Ensure all paths return + + return inner + + def _trace_async_list_function( + self, + function: Callable, + *, + _args_to_ignore: Optional[List[str]] = None, + _trace_type=TraceType.AGENTS, + _name: Optional[str] = None, + ) -> Callable: + """ + Decorator that adds tracing to an asynchronous function. + + :param function: The function to be traced. + :type function: Callable + :param args_to_ignore: A list of argument names to be ignored in the trace. + Defaults to None. + :type: args_to_ignore: [List[str]], optional + :param trace_type: The type of the trace. Defaults to TraceType.AGENTS. + :type trace_type: TraceType, optional + :param name: The name of the trace, will set to func name if not provided. + :type name: str, optional + :return: The traced function. + :rtype: Callable + """ + + @functools.wraps(function) + def inner(*args, **kwargs): # pylint: disable=R0911 + span_impl_type = settings.tracing_implementation() # pylint: disable=E1102 + if span_impl_type is None: + return function(*args, **kwargs) + + class_function_name = function.__qualname__ + if class_function_name.startswith("MessagesOperations.list"): + kwargs.setdefault("merge_span", True) + return self.trace_list_messages_async(function, *args, **kwargs) + if class_function_name.startswith("RunStepsOperations.list"): + kwargs.setdefault("merge_span", True) + return self.trace_list_run_steps_async(function, *args, **kwargs) + # Handle the default case (if the function name does not match) + return None # Ensure all paths return + + return inner + + def _inject_async(self, f, _trace_type, _name): + if _name.startswith("list"): + wrapper_fun = self._trace_async_list_function(f) + else: + wrapper_fun = self._trace_async_function(f) + wrapper_fun._original = f # pylint: disable=protected-access # pyright: ignore [reportFunctionMemberAccess] + return wrapper_fun + + def _inject_sync(self, f, _trace_type, _name): + wrapper_fun = self._trace_sync_function(f) + wrapper_fun._original = f # pylint: disable=protected-access # pyright: ignore [reportFunctionMemberAccess] + return wrapper_fun + + def _agents_apis(self): + sync_apis = ( + ( + "azure.ai.projects.operations", + "AgentsOperations", + "create_version", + TraceType.AGENTS, + "create_version", + ), + # ( + # "azure.ai.agents.operations", + # "ConversationsOperations", + # "create", + # TraceType.AGENTS, + # "create", + # ), + ) + async_apis = ( + ( + "azure.ai.projects.aio.operations", + "AgentsOperations", + "create_version", + TraceType.AGENTS, + "create_version", + ), + # ( + # "azure.ai.agents.aio.operations", + # "ConversationsOperations", + # "create", + # TraceType.AGENTS, + # "create", + # ), + ) + return sync_apis, async_apis + + def _agents_api_list(self): + sync_apis, async_apis = self._agents_apis() + yield sync_apis, self._inject_sync + yield async_apis, self._inject_async + + def _generate_api_and_injector(self, apis): + for api, injector in apis: + for module_name, class_name, method_name, trace_type, name in api: + try: + module = importlib.import_module(module_name) + api = getattr(module, class_name) + if hasattr(api, method_name): + # The function list is sync in both sync and async classes. + yield api, method_name, trace_type, injector, name + except AttributeError as e: + # Log the attribute exception with the missing class information + logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug + "AttributeError: The module '%s' does not have the class '%s'. %s", + module_name, + class_name, + str(e), + ) + except Exception as e: # pylint: disable=broad-except + # Log other exceptions as a warning, as we are not sure what they might be + logger.warning( # pylint: disable=do-not-log-exceptions-if-not-debug + "An unexpected error occurred: '%s'", str(e) + ) + + def _available_agents_apis_and_injectors(self): + """ + Generates a sequence of tuples containing Agents API classes, method names, and + corresponding injector functions. + + :return: A generator yielding tuples. + :rtype: tuple + """ + yield from self._generate_api_and_injector(self._agents_api_list()) + + def _instrument_agents(self, enable_content_tracing: bool = False): + """This function modifies the methods of the Agents API classes to + inject logic before calling the original methods. + The original methods are stored as _original attributes of the methods. + + :param enable_content_tracing: Indicates whether tracing of message content should be enabled. + This also controls whether function call tool function names, + parameter names and parameter values are traced. + :type enable_content_tracing: bool + """ + # pylint: disable=W0603 + global _agents_traces_enabled + global _trace_agents_content + if _agents_traces_enabled: + raise RuntimeError("Traces already started for AI Agents") + + _agents_traces_enabled = True + _trace_agents_content = enable_content_tracing + for ( + api, + method, + trace_type, + injector, + name, + ) in self._available_agents_apis_and_injectors(): + # Check if the method of the api class has already been modified + if not hasattr(getattr(api, method), "_original"): + setattr(api, method, injector(getattr(api, method), trace_type, name)) + + def _uninstrument_agents(self): + """This function restores the original methods of the Agents API classes + by assigning them back from the _original attributes of the modified methods. + """ + # pylint: disable=W0603 + global _agents_traces_enabled + global _trace_agents_content + _trace_agents_content = False + for api, method, _, _, _ in self._available_agents_apis_and_injectors(): + if hasattr(getattr(api, method), "_original"): + setattr(api, method, getattr(getattr(api, method), "_original")) + + _agents_traces_enabled = False + + def _is_instrumented(self): + """This function returns True if Agents API has already been instrumented + for tracing and False if it has not been instrumented. + + :return: A value indicating whether the Agents API is currently instrumented or not. + :rtype: bool + """ + return _agents_traces_enabled + + def _set_enable_content_recording(self, enable_content_recording: bool = False) -> None: + """This function sets the content recording value. + + :param enable_content_recording: Indicates whether tracing of message content should be enabled. + This also controls whether function call tool function names, + parameter names and parameter values are traced. + :type enable_content_recording: bool + """ + global _trace_agents_content # pylint: disable=W0603 + _trace_agents_content = enable_content_recording + + def _is_content_recording_enabled(self) -> bool: + """This function gets the content recording value. + + :return: A bool value indicating whether content tracing is enabled. + :rtype bool + """ + return _trace_agents_content + + def record_error(self, span, exc): + # Set the span status to error + if isinstance(span.span_instance, Span): # pyright: ignore [reportPossiblyUnboundVariable] + span.span_instance.set_status( + StatusCode.ERROR, # pyright: ignore [reportPossiblyUnboundVariable] + description=str(exc), + ) + module = getattr(exc, "__module__", "") + module = module if module != "builtins" else "" + error_type = f"{module}.{type(exc).__name__}" if module else type(exc).__name__ + self._set_attributes(span, ("error.type", error_type)) diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_trace_function.py b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_trace_function.py new file mode 100644 index 000000000000..04a5989795df --- /dev/null +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_trace_function.py @@ -0,0 +1,204 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import functools +import asyncio # pylint: disable = do-not-import-asyncio +from typing import Any, Callable, Optional, Dict + +try: + # pylint: disable = no-name-in-module + from opentelemetry import trace as opentelemetry_trace + + tracer = opentelemetry_trace.get_tracer(__name__) # type: ignore[attr-defined] + _tracing_library_available = True +except ModuleNotFoundError: + _tracing_library_available = False + +if _tracing_library_available: + + def trace_function(span_name: Optional[str] = None): + """ + A decorator for tracing function calls using OpenTelemetry. + + This decorator handles various data types for function parameters and return values, + and records them as attributes in the trace span. The supported data types include: + - Basic data types: str, int, float, bool + - Collections: list, dict, tuple, set + + Special handling for collections: + - If a collection (list, dict, tuple, set) contains nested collections, the entire collection + is converted to a string before being recorded as an attribute. + - Sets and dictionaries are always converted to strings to ensure compatibility with span attributes. + + Object types are omitted, and the corresponding parameter is not traced. + + :param span_name: The name of the span. If not provided, the function name is used. + :type span_name: Optional[str] + :return: The decorated function with tracing enabled. + :rtype: Callable + """ + + def decorator(func: Callable) -> Callable: + @functools.wraps(func) + async def async_wrapper(*args: Any, **kwargs: Any) -> Any: + """ + Wrapper function for asynchronous functions. + + :param args: Positional arguments passed to the function. + :type args: Tuple[Any] + :return: The result of the decorated asynchronous function. + :rtype: Any + """ + name = span_name if span_name else func.__name__ + with tracer.start_as_current_span(name) as span: + try: + # Sanitize parameters and set them as attributes + sanitized_params = sanitize_parameters(func, *args, **kwargs) + span.set_attributes(sanitized_params) + result = await func(*args, **kwargs) + sanitized_result = sanitize_for_attributes(result) + if sanitized_result is not None: + if isinstance(sanitized_result, (list, dict, tuple, set)): + if any(isinstance(i, (list, dict, tuple, set)) for i in sanitized_result): + sanitized_result = str(sanitized_result) + span.set_attribute("code.function.return.value", sanitized_result) # type: ignore + return result + except Exception as e: + span.record_exception(e) + span.set_attribute("error.type", e.__class__.__qualname__) # type: ignore + raise + + @functools.wraps(func) + def sync_wrapper(*args: Any, **kwargs: Any) -> Any: + """ + Wrapper function for synchronous functions. + + :param args: Positional arguments passed to the function. + :type args: Tuple[Any] + :return: The result of the decorated synchronous function. + :rtype: Any + """ + name = span_name if span_name else func.__name__ + with tracer.start_as_current_span(name) as span: + try: + # Sanitize parameters and set them as attributes + sanitized_params = sanitize_parameters(func, *args, **kwargs) + span.set_attributes(sanitized_params) + result = func(*args, **kwargs) + sanitized_result = sanitize_for_attributes(result) + if sanitized_result is not None: + if isinstance(sanitized_result, (list, dict, tuple, set)): + if any(isinstance(i, (list, dict, tuple, set)) for i in sanitized_result): + sanitized_result = str(sanitized_result) + span.set_attribute("code.function.return.value", sanitized_result) # type: ignore + return result + except Exception as e: + span.record_exception(e) + span.set_attribute("error.type", e.__class__.__qualname__) # type: ignore + raise + + # Determine if the function is async + if asyncio.iscoroutinefunction(func): + return async_wrapper + return sync_wrapper + + return decorator + +else: + # Define a no-op decorator if OpenTelemetry is not available + def trace_function(span_name: Optional[str] = None): # pylint: disable=unused-argument + """ + A no-op decorator for tracing function calls when OpenTelemetry is not available. + + :param span_name: Not used in this version. + :type span_name: Optional[str] + :return: The original function. + :rtype: Callable + """ + + def decorator(func: Callable) -> Callable: + return func + + return decorator + + +def sanitize_parameters(func, *args, **kwargs) -> Dict[str, Any]: + """ + Sanitize function parameters to include only built-in data types. + + :param func: The function being decorated. + :type func: Callable + :param args: Positional arguments passed to the function. + :type args: Tuple[Any] + :return: A dictionary of sanitized parameters. + :rtype: Dict[str, Any] + """ + import inspect + + params = inspect.signature(func).parameters + sanitized_params = {} + + for i, (name, param) in enumerate(params.items()): + if param.default == inspect.Parameter.empty and i < len(args): + value = args[i] + else: + value = kwargs.get(name, param.default) + + sanitized_value = sanitize_for_attributes(value) + # Check if the collection has nested collections + if isinstance(sanitized_value, (list, dict, tuple, set)): + if any(isinstance(i, (list, dict, tuple, set)) for i in sanitized_value): + sanitized_value = str(sanitized_value) + if sanitized_value is not None: + sanitized_params["code.function.parameter." + name] = sanitized_value + + return sanitized_params + + +# pylint: disable=R0911 +def sanitize_for_attributes(value: Any, is_recursive: bool = False) -> Any: + """ + Sanitize a value to be used as an attribute. + + :param value: The value to sanitize. + :type value: Any + :param is_recursive: Indicates if the function is being called recursively. Default is False. + :type is_recursive: bool + :return: The sanitized value or None if the value is not a supported type. + :rtype: Any + """ + if isinstance(value, (str, int, float, bool)): + return value + if isinstance(value, list): + return [ + sanitize_for_attributes(item, True) + for item in value + if isinstance(item, (str, int, float, bool, list, dict, tuple, set)) + ] + if isinstance(value, dict): + retval = { + k: sanitize_for_attributes(v, True) + for k, v in value.items() + if isinstance(v, (str, int, float, bool, list, dict, tuple, set)) + } + # dict to compatible with span attribute, so return it as a string + if is_recursive: + return retval + return str(retval) + if isinstance(value, tuple): + return tuple( + sanitize_for_attributes(item, True) + for item in value + if isinstance(item, (str, int, float, bool, list, dict, tuple, set)) + ) + if isinstance(value, set): + retval_set = { + sanitize_for_attributes(item, True) + for item in value + if isinstance(item, (str, int, float, bool, list, dict, tuple, set)) + } + if is_recursive: + return retval_set + return str(retval_set) + return None diff --git a/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_utils.py b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_utils.py new file mode 100644 index 000000000000..298d66e6b425 --- /dev/null +++ b/sdk/ai/azure-ai-projects/azure/ai/projects/telemetry/_utils.py @@ -0,0 +1,168 @@ +# pylint: disable=line-too-long,useless-suppression +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from typing import Optional +import logging +from enum import Enum + +from azure.core.tracing import AbstractSpan, SpanKind # type: ignore +from azure.core.settings import settings # type: ignore + +try: + from opentelemetry.trace import StatusCode, Span # noqa: F401 # pylint: disable=unused-import + + _span_impl_type = settings.tracing_implementation() # pylint: disable=not-callable +except ModuleNotFoundError: + _span_impl_type = None + +logger = logging.getLogger(__name__) + + +GEN_AI_MESSAGE_ID = "gen_ai.message.id" +GEN_AI_MESSAGE_STATUS = "gen_ai.message.status" +GEN_AI_THREAD_ID = "gen_ai.thread.id" +GEN_AI_THREAD_RUN_ID = "gen_ai.thread.run.id" +GEN_AI_AGENT_ID = "gen_ai.agent.id" +GEN_AI_AGENT_NAME = "gen_ai.agent.name" +GEN_AI_AGENT_DESCRIPTION = "gen_ai.agent.description" +GEN_AI_OPERATION_NAME = "gen_ai.operation.name" +GEN_AI_THREAD_RUN_STATUS = "gen_ai.thread.run.status" +GEN_AI_REQUEST_MODEL = "gen_ai.request.model" +GEN_AI_REQUEST_TEMPERATURE = "gen_ai.request.temperature" +GEN_AI_REQUEST_TOP_P = "gen_ai.request.top_p" +GEN_AI_REQUEST_MAX_INPUT_TOKENS = "gen_ai.request.max_input_tokens" +GEN_AI_REQUEST_MAX_OUTPUT_TOKENS = "gen_ai.request.max_output_tokens" +GEN_AI_RESPONSE_MODEL = "gen_ai.response.model" +GEN_AI_SYSTEM = "gen_ai.system" +SERVER_ADDRESS = "server.address" +SERVER_PORT = "server.port" +AZ_AI_AGENT_SYSTEM = "az.ai.agents" +AZURE_AI_AGENTS = "azure.ai.agents" +AZ_NAMESPACE = "az.namespace" +AZ_NAMESPACE_VALUE = "Microsoft.CognitiveServices" +GEN_AI_TOOL_NAME = "gen_ai.tool.name" +GEN_AI_TOOL_CALL_ID = "gen_ai.tool.call.id" +GEN_AI_REQUEST_RESPONSE_FORMAT = "gen_ai.request.response_format" +GEN_AI_USAGE_INPUT_TOKENS = "gen_ai.usage.input_tokens" +GEN_AI_USAGE_OUTPUT_TOKENS = "gen_ai.usage.output_tokens" +GEN_AI_SYSTEM_MESSAGE = "gen_ai.system.instruction" +GEN_AI_EVENT_CONTENT = "gen_ai.event.content" +GEN_AI_RUN_STEP_START_TIMESTAMP = "gen_ai.run_step.start.timestamp" +GEN_AI_RUN_STEP_END_TIMESTAMP = "gen_ai.run_step.end.timestamp" +GEN_AI_RUN_STEP_STATUS = "gen_ai.run_step.status" +ERROR_TYPE = "error.type" +ERROR_MESSAGE = "error.message" +GEN_AI_SEMANTIC_CONVENTIONS_SCHEMA_VERSION = "1.34.0" +GEN_AI_PROVIDER_NAME = "gen_ai.provider.name" + +# Added to the latest version, not part of semantic conventions +GEN_AI_REQUEST_REASONING_EFFORT = "gen_ai.request.reasoning.effort" +GEN_AI_REQUEST_REASONING_SUMMARY = "gen_ai.request.reasoning.summary" +GEN_AI_REQUEST_STRUCTURED_INPUTS = "gen_ai.request.structured_inputs" +GEN_AI_AGENT_VERSION = "gen_ai.agent.version" + + +class OperationName(Enum): + CREATE_AGENT = "create_agent" + CREATE_THREAD = "create_thread" + CREATE_MESSAGE = "create_message" + START_THREAD_RUN = "start_thread_run" + GET_THREAD_RUN = "get_thread_run" + EXECUTE_TOOL = "execute_tool" + LIST_MESSAGES = "list_messages" + LIST_RUN_STEPS = "list_run_steps" + SUBMIT_TOOL_OUTPUTS = "submit_tool_outputs" + PROCESS_THREAD_RUN = "process_thread_run" + + +def start_span( + operation_name: OperationName, + server_address: Optional[str], + port: Optional[int] = None, + span_name: Optional[str] = None, + thread_id: Optional[str] = None, + agent_id: Optional[str] = None, + run_id: Optional[str] = None, + model: Optional[str] = None, + temperature: Optional[float] = None, + top_p: Optional[float] = None, + max_prompt_tokens: Optional[int] = None, + max_completion_tokens: Optional[int] = None, + response_format: Optional[str] = None, + reasoning: Optional[str] = None, # pylint: disable=unused-argument + reasoning_effort: Optional[str] = None, + reasoning_summary: Optional[str] = None, + structured_inputs: Optional[str] = None, + gen_ai_system: Optional[str] = AZ_AI_AGENT_SYSTEM, + gen_ai_provider: Optional[str] = AZURE_AI_AGENTS, + kind: SpanKind = SpanKind.CLIENT, +) -> "Optional[AbstractSpan]": + global _span_impl_type # pylint: disable=global-statement + if _span_impl_type is None: + # Try to reinitialize the span implementation type. + # This is a workaround for the case when the tracing implementation is not set up yet when the agent telemetry is imported. + # This code should not even get called if settings.tracing_implementation() returns None since that is also checked in + # _trace_sync_function and _trace_async_function functions in the AIProjectInstrumentor. + _span_impl_type = settings.tracing_implementation() # pylint: disable=not-callable + if _span_impl_type is None: + return None + + span = _span_impl_type( + name=span_name or operation_name.value, kind=kind, schema_version=GEN_AI_SEMANTIC_CONVENTIONS_SCHEMA_VERSION + ) + + if span and span.span_instance.is_recording: + span.add_attribute(AZ_NAMESPACE, AZ_NAMESPACE_VALUE) + span.add_attribute(GEN_AI_PROVIDER_NAME, AZURE_AI_AGENTS) + + if gen_ai_provider: + span.add_attribute(GEN_AI_PROVIDER_NAME, gen_ai_provider) + + if gen_ai_system: + span.add_attribute(GEN_AI_SYSTEM, gen_ai_system) + + if server_address: + span.add_attribute(SERVER_ADDRESS, server_address) + + if port is not None and port != 443: + span.add_attribute(SERVER_PORT, port) + + if thread_id: + span.add_attribute(GEN_AI_THREAD_ID, thread_id) + + if agent_id: + span.add_attribute(GEN_AI_AGENT_ID, agent_id) + + if run_id: + span.add_attribute(GEN_AI_THREAD_RUN_ID, run_id) + + if model: + span.add_attribute(GEN_AI_REQUEST_MODEL, model) + + if temperature: + span.add_attribute(GEN_AI_REQUEST_TEMPERATURE, str(temperature)) + + if top_p: + span.add_attribute(GEN_AI_REQUEST_TOP_P, str(top_p)) + + if max_prompt_tokens: + span.add_attribute(GEN_AI_REQUEST_MAX_INPUT_TOKENS, max_prompt_tokens) + + if max_completion_tokens: + span.add_attribute(GEN_AI_REQUEST_MAX_OUTPUT_TOKENS, max_completion_tokens) + + if response_format: + span.add_attribute(GEN_AI_REQUEST_RESPONSE_FORMAT, response_format) + + if reasoning_effort: + span.add_attribute(GEN_AI_REQUEST_REASONING_EFFORT, reasoning_effort) + + if reasoning_summary: + span.add_attribute(GEN_AI_REQUEST_REASONING_SUMMARY, reasoning_summary) + + if structured_inputs: + span.add_attribute(GEN_AI_REQUEST_STRUCTURED_INPUTS, structured_inputs) + + return span diff --git a/sdk/ai/azure-ai-projects/cspell.json b/sdk/ai/azure-ai-projects/cspell.json index 95aa0ad03895..119c172303c4 100644 --- a/sdk/ai/azure-ai-projects/cspell.json +++ b/sdk/ai/azure-ai-projects/cspell.json @@ -12,6 +12,16 @@ "quantitive", "balapvbyostoragecanary", "fspath", + "aread", + "ilike", + "inpainting", + "CPSDL", + "dmcp", + "Clippy", + "Bellingshausen", + "Lazarev", + "ROYGBIV", + "aiofiles" ], "ignorePaths": [ ] diff --git a/sdk/ai/azure-ai-projects/dev_requirements.txt b/sdk/ai/azure-ai-projects/dev_requirements.txt index f7e4ddcc9fa4..8de8c109fac3 100644 --- a/sdk/ai/azure-ai-projects/dev_requirements.txt +++ b/sdk/ai/azure-ai-projects/dev_requirements.txt @@ -5,3 +5,7 @@ aiohttp python-dotenv azure.ai.inference openai +opentelemetry-sdk +azure-core-tracing-opentelemetry +azure-monitor-opentelemetry + diff --git a/sdk/ai/azure-ai-projects/post-emitter-fixes.cmd b/sdk/ai/azure-ai-projects/post-emitter-fixes.cmd index f8629d6831c1..1f8593f143cc 100644 --- a/sdk/ai/azure-ai-projects/post-emitter-fixes.cmd +++ b/sdk/ai/azure-ai-projects/post-emitter-fixes.cmd @@ -1,7 +1,7 @@ REM -REM To emit from typespec, run this in the current folder: +REM To emit from TypeSpec, run this in the current folder: REM -REM tsp-client update --local-spec-repo e:\src\azure-rest-api-specs-pr\specification\ai\Azure.AI.Projects +REM tsp-client update --debug --local-spec-repo e:\src\azure-rest-api-specs-pr\specification\ai\Azure.AI.Projects REM REM (replace `e:\src\...` with the local folder containing up to date TypeSpec) REM @@ -13,4 +13,18 @@ git restore pyproject.toml git restore azure\ai\projects\_version.py REM We don't use auto-generated tests. Can this TypeSpec be change to no generate them? -rmdir /s /q generated_tests +REM rmdir /s /q generated_tests + +REM Add quotation marks around "str" in the expression: content: Union[str, list["_models.ItemContent"]] = rest_field( +REM This fixes the serialization of this expression: item_param: ItemParam = ResponsesUserMessageItemParam(content="my text") +powershell -Command "(Get-Content azure\ai\projects\models\_models.py) -replace 'Union\[str, list\[\"_models\.ItemContent\"\]\] = rest_field\(', 'Union[\"str\", list[\"_models.ItemContent\"]] = rest_field(' | Set-Content azure\ai\projects\models\_models.py" + +REM Fix type annotations by replacing "_types.Filters" with proper union type to fix Pyright errors +powershell -Command "(Get-Content azure\ai\projects\models\_models.py) -replace '\"_types\.Filters\"', 'Union[\"_models.ComparisonFilter\", \"_models.CompoundFilter\"]' | Set-Content azure\ai\projects\models\_models.py" + +REM Add additional pylint disables to the model_base.py file +powershell -Command "(Get-Content azure\ai\projects\_utils\model_base.py) -replace '# pylint: disable=protected-access, broad-except', '# pylint: disable=protected-access, broad-except, import-error, no-value-for-parameter' | Set-Content azure\ai\projects\_utils\model_base.py" + +REM Disable the version validation +powershell -Command "(Get-Content azure\ai\projects\_validation.py) -replace 'if _index_with_default\(method_added_on\) > _index_with_default\(client_api_version\):', 'if False: # pylint: disable=using-constant-test' | Set-Content azure\ai\projects\_validation.py" +powershell -Command "(Get-Content azure\ai\projects\_validation.py) -replace 'if unsupported:', 'if False: # pylint: disable=using-constant-test' | Set-Content azure\ai\projects\_validation.py" diff --git a/sdk/ai/azure-ai-projects/pyproject.toml b/sdk/ai/azure-ai-projects/pyproject.toml index 2bd405f651c5..68c26a6e4f47 100644 --- a/sdk/ai/azure-ai-projects/pyproject.toml +++ b/sdk/ai/azure-ai-projects/pyproject.toml @@ -14,7 +14,7 @@ name = "azure-ai-projects" authors = [ { name = "Microsoft Corporation", email = "azpysdkhelp@microsoft.com" }, ] -description = "Microsoft Corporation Azure AI Projects Client Library for Python" +description = "Microsoft Corporation Azure Ai Projects Client Library for Python" license = "MIT" classifiers = [ "Development Status :: 4 - Beta", @@ -35,11 +35,9 @@ dependencies = [ "azure-core>=1.35.0", "typing-extensions>=4.6.0", "azure-storage-blob>=12.15.0", - "azure-ai-agents>=1.2.0b3", ] dynamic = [ - "version", - "readme" +"version", "readme" ] [project.urls] diff --git a/sdk/ai/azure-ai-projects/pyrightconfig.json b/sdk/ai/azure-ai-projects/pyrightconfig.json index 5bf110e10df8..c6dcf991a868 100644 --- a/sdk/ai/azure-ai-projects/pyrightconfig.json +++ b/sdk/ai/azure-ai-projects/pyrightconfig.json @@ -9,7 +9,6 @@ "./../../evaluation/azure-ai-evaluation", "./../../identity/azure-identity", "./../../monitor/azure-monitor-opentelemetry", - "./../azure-ai-inference", - "./../azure-ai-agents" + "./../azure-ai-inference" ] } \ No newline at end of file diff --git a/sdk/ai/azure-ai-projects/samples/agents/README.md b/sdk/ai/azure-ai-projects/samples/agents/README.md deleted file mode 100644 index b03e553bb835..000000000000 --- a/sdk/ai/azure-ai-projects/samples/agents/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Agents samples - -This directory intentionally contains only one sample. - -The full set of Agent samples can be found in the [samples folder](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/ai/azure-ai-agents/samples) of the `azure-ai-agents` package. - -See also `azure-ai-agents` package [README.md](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/ai/azure-ai-agents). - diff --git a/sdk/ai/azure-ai-projects/samples/agents/assets/cua_browser_search.png b/sdk/ai/azure-ai-projects/samples/agents/assets/cua_browser_search.png new file mode 100644 index 0000000000000000000000000000000000000000..31325a9c3df654c44b481bfa7d287b55359d964d GIT binary patch literal 566095 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 z

PCc{L~d%b(&g$DlMKn8jJ^nk4 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