qca 0.0.1.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qca/__init__.py +50 -0
- qca/_version.py +1 -0
- qca/common/__init__.py +43 -0
- qca/common/_base_client.py +450 -0
- qca/common/_exceptions.py +97 -0
- qca/common/_files.py +38 -0
- qca/common/_models.py +33 -0
- qca/common/_resource.py +35 -0
- qca/common/_response.py +220 -0
- qca/common/_streaming.py +143 -0
- qca/common/_types.py +25 -0
- qca/common/_utils.py +73 -0
- qca/common/credentials.py +13 -0
- qca/common/pagination.py +118 -0
- qca/forward/__init__.py +7 -0
- qca/forward/_client.py +142 -0
- qca/forward/resources/__init__.py +14 -0
- qca/forward/resources/batches/__init__.py +4 -0
- qca/forward/resources/batches/batches.py +308 -0
- qca/forward/resources/batches/tasks.py +71 -0
- qca/forward/resources/channel_pairings.py +111 -0
- qca/forward/resources/channels/__init__.py +4 -0
- qca/forward/resources/channels/channels.py +336 -0
- qca/forward/resources/channels/qr_sessions.py +106 -0
- qca/forward/resources/environments.py +305 -0
- qca/forward/resources/files.py +272 -0
- qca/forward/resources/identities/__init__.py +6 -0
- qca/forward/resources/identities/configs.py +249 -0
- qca/forward/resources/identities/identities.py +570 -0
- qca/forward/resources/identities/memory_stores.py +186 -0
- qca/forward/resources/memory_stores/__init__.py +6 -0
- qca/forward/resources/memory_stores/memories.py +290 -0
- qca/forward/resources/memory_stores/memory_stores.py +321 -0
- qca/forward/resources/memory_stores/memory_versions.py +179 -0
- qca/forward/resources/models.py +58 -0
- qca/forward/resources/schedule_runs.py +149 -0
- qca/forward/resources/schedules.py +545 -0
- qca/forward/resources/sessions/__init__.py +6 -0
- qca/forward/resources/sessions/events.py +208 -0
- qca/forward/resources/sessions/resources.py +66 -0
- qca/forward/resources/sessions/sessions.py +417 -0
- qca/forward/resources/sessions/threads/__init__.py +4 -0
- qca/forward/resources/sessions/threads/events.py +128 -0
- qca/forward/resources/sessions/threads/threads.py +177 -0
- qca/forward/resources/skills/__init__.py +4 -0
- qca/forward/resources/skills/skills.py +335 -0
- qca/forward/resources/skills/versions.py +253 -0
- qca/forward/resources/templates.py +426 -0
- qca/forward/resources/vaults/__init__.py +4 -0
- qca/forward/resources/vaults/credentials.py +227 -0
- qca/forward/resources/vaults/vaults.py +217 -0
- qca/forward/types/__init__.py +205 -0
- qca/forward/types/batch.py +35 -0
- qca/forward/types/batch_cancel_params.py +11 -0
- qca/forward/types/batch_create_params.py +14 -0
- qca/forward/types/batch_file.py +13 -0
- qca/forward/types/batch_list_params.py +14 -0
- qca/forward/types/batch_request_counts.py +17 -0
- qca/forward/types/batch_task.py +24 -0
- qca/forward/types/batch_task_artifacts_item.py +14 -0
- qca/forward/types/batch_task_error.py +12 -0
- qca/forward/types/batch_task_list_params.py +14 -0
- qca/forward/types/batch_task_usage.py +11 -0
- qca/forward/types/batch_usage.py +11 -0
- qca/forward/types/channel.py +27 -0
- qca/forward/types/channel_channel_config.py +14 -0
- qca/forward/types/channel_channel_config_response_options.py +12 -0
- qca/forward/types/channel_create_params.py +18 -0
- qca/forward/types/channel_identity_resolution.py +11 -0
- qca/forward/types/channel_list_params.py +18 -0
- qca/forward/types/channel_pairing.py +17 -0
- qca/forward/types/channel_pairing_create_params.py +14 -0
- qca/forward/types/channel_qr_session.py +19 -0
- qca/forward/types/channel_qr_session_create_params.py +11 -0
- qca/forward/types/channel_update_params.py +16 -0
- qca/forward/types/content_block_param.py +17 -0
- qca/forward/types/deleted_channel.py +12 -0
- qca/forward/types/deleted_channel_pairing.py +12 -0
- qca/forward/types/deleted_identity.py +12 -0
- qca/forward/types/deleted_memory.py +13 -0
- qca/forward/types/deleted_memory_store.py +13 -0
- qca/forward/types/deleted_memory_store_mount.py +13 -0
- qca/forward/types/deleted_skill_version.py +13 -0
- qca/forward/types/effective_config.py +23 -0
- qca/forward/types/effective_config_agent.py +19 -0
- qca/forward/types/effective_config_agent_tools_item.py +15 -0
- qca/forward/types/effective_config_agent_tools_item_configs_item.py +12 -0
- qca/forward/types/effective_config_session.py +17 -0
- qca/forward/types/effective_config_session_resources_item.py +14 -0
- qca/forward/types/environment.py +24 -0
- qca/forward/types/environment_config.py +15 -0
- qca/forward/types/environment_config_packages.py +17 -0
- qca/forward/types/environment_create_params.py +15 -0
- qca/forward/types/environment_list_params.py +14 -0
- qca/forward/types/environment_update_params.py +14 -0
- qca/forward/types/environment_variable_override.py +12 -0
- qca/forward/types/environment_variable_override_param.py +12 -0
- qca/forward/types/file_list_params.py +16 -0
- qca/forward/types/file_metadata.py +22 -0
- qca/forward/types/file_upload_params.py +17 -0
- qca/forward/types/git_hub_repository.py +13 -0
- qca/forward/types/git_hub_repository_param.py +14 -0
- qca/forward/types/identity.py +19 -0
- qca/forward/types/identity_clear_params.py +11 -0
- qca/forward/types/identity_clear_response.py +18 -0
- qca/forward/types/identity_clear_response_summary.py +16 -0
- qca/forward/types/identity_config.py +25 -0
- qca/forward/types/identity_config_list_params.py +15 -0
- qca/forward/types/identity_config_spec.py +31 -0
- qca/forward/types/identity_config_spec_param.py +31 -0
- qca/forward/types/identity_config_upsert_params.py +17 -0
- qca/forward/types/identity_create_params.py +15 -0
- qca/forward/types/identity_list_params.py +17 -0
- qca/forward/types/identity_list_templates_response.py +14 -0
- qca/forward/types/identity_memory_store_list_response.py +15 -0
- qca/forward/types/identity_memory_store_mount_params.py +9 -0
- qca/forward/types/identity_stats.py +14 -0
- qca/forward/types/identity_template.py +15 -0
- qca/forward/types/identity_update_params.py +15 -0
- qca/forward/types/image_source_param.py +15 -0
- qca/forward/types/mcp_server.py +13 -0
- qca/forward/types/mcp_server_override.py +13 -0
- qca/forward/types/mcp_server_override_param.py +13 -0
- qca/forward/types/mcp_server_param.py +13 -0
- qca/forward/types/memory.py +21 -0
- qca/forward/types/memory_store.py +25 -0
- qca/forward/types/memory_store_create_params.py +14 -0
- qca/forward/types/memory_store_list_params.py +14 -0
- qca/forward/types/memory_store_memory_create_params.py +13 -0
- qca/forward/types/memory_store_memory_list_params.py +14 -0
- qca/forward/types/memory_store_memory_update_params.py +13 -0
- qca/forward/types/memory_store_memory_version_list_params.py +14 -0
- qca/forward/types/memory_store_mount.py +20 -0
- qca/forward/types/memory_store_update_params.py +13 -0
- qca/forward/types/memory_version.py +23 -0
- qca/forward/types/model.py +23 -0
- qca/forward/types/model_config.py +13 -0
- qca/forward/types/model_config_param.py +13 -0
- qca/forward/types/model_list_response.py +15 -0
- qca/forward/types/multiagent_config.py +15 -0
- qca/forward/types/multiagent_config_param.py +15 -0
- qca/forward/types/multiagent_entry.py +13 -0
- qca/forward/types/multiagent_entry_param.py +13 -0
- qca/forward/types/permission_policy.py +11 -0
- qca/forward/types/permission_policy_param.py +9 -0
- qca/forward/types/resource_binding.py +11 -0
- qca/forward/types/resource_binding_param.py +11 -0
- qca/forward/types/schedule.py +34 -0
- qca/forward/types/schedule_archive_many_params.py +12 -0
- qca/forward/types/schedule_archive_many_response.py +11 -0
- qca/forward/types/schedule_archive_params.py +11 -0
- qca/forward/types/schedule_create_params.py +21 -0
- qca/forward/types/schedule_execution.py +14 -0
- qca/forward/types/schedule_initial_events_item.py +12 -0
- qca/forward/types/schedule_list_params.py +19 -0
- qca/forward/types/schedule_pause_params.py +11 -0
- qca/forward/types/schedule_paused_reason.py +11 -0
- qca/forward/types/schedule_run.py +33 -0
- qca/forward/types/schedule_run_list_params.py +20 -0
- qca/forward/types/schedule_run_params.py +11 -0
- qca/forward/types/schedule_run_retrieve_params.py +11 -0
- qca/forward/types/schedule_run_trigger_context.py +13 -0
- qca/forward/types/schedule_sinks_item.py +16 -0
- qca/forward/types/schedule_sinks_item_target.py +12 -0
- qca/forward/types/schedule_trigger_policy.py +15 -0
- qca/forward/types/schedule_unpause_params.py +11 -0
- qca/forward/types/schedule_update_params.py +20 -0
- qca/forward/types/session.py +33 -0
- qca/forward/types/session_archive_params.py +11 -0
- qca/forward/types/session_cancel_params.py +11 -0
- qca/forward/types/session_config.py +11 -0
- qca/forward/types/session_create_params.py +21 -0
- qca/forward/types/session_create_params_config_param.py +11 -0
- qca/forward/types/session_event.py +52 -0
- qca/forward/types/session_event_list_params.py +18 -0
- qca/forward/types/session_event_param.py +24 -0
- qca/forward/types/session_event_send_params.py +15 -0
- qca/forward/types/session_event_send_response.py +14 -0
- qca/forward/types/session_event_stream_params.py +14 -0
- qca/forward/types/session_list_params.py +27 -0
- qca/forward/types/session_resource.py +17 -0
- qca/forward/types/session_resource_add_params.py +13 -0
- qca/forward/types/session_resource_spec_param.py +13 -0
- qca/forward/types/session_stats.py +12 -0
- qca/forward/types/session_template.py +18 -0
- qca/forward/types/session_thread.py +27 -0
- qca/forward/types/session_thread_archive_params.py +11 -0
- qca/forward/types/session_thread_event_list_params.py +13 -0
- qca/forward/types/session_thread_event_stream_params.py +11 -0
- qca/forward/types/session_thread_list_params.py +13 -0
- qca/forward/types/session_thread_stop_reason.py +11 -0
- qca/forward/types/session_update_params.py +17 -0
- qca/forward/types/session_update_params_config_param.py +11 -0
- qca/forward/types/session_usage.py +11 -0
- qca/forward/types/skill.py +23 -0
- qca/forward/types/skill_binding.py +14 -0
- qca/forward/types/skill_binding_param.py +14 -0
- qca/forward/types/skill_create_params.py +20 -0
- qca/forward/types/skill_list_params.py +17 -0
- qca/forward/types/skill_override.py +13 -0
- qca/forward/types/skill_override_param.py +13 -0
- qca/forward/types/skill_retrieve_params.py +11 -0
- qca/forward/types/skill_update_params.py +16 -0
- qca/forward/types/skill_version.py +22 -0
- qca/forward/types/skill_version_create_params.py +13 -0
- qca/forward/types/skill_version_list_params.py +12 -0
- qca/forward/types/system_override.py +12 -0
- qca/forward/types/system_override_param.py +12 -0
- qca/forward/types/template.py +39 -0
- qca/forward/types/template_archive_params.py +11 -0
- qca/forward/types/template_clone_params.py +13 -0
- qca/forward/types/template_create_params.py +35 -0
- qca/forward/types/template_list_params.py +14 -0
- qca/forward/types/template_update_params.py +35 -0
- qca/forward/types/tool.py +21 -0
- qca/forward/types/tool_config.py +16 -0
- qca/forward/types/tool_config_param.py +16 -0
- qca/forward/types/tool_override.py +15 -0
- qca/forward/types/tool_override_param.py +15 -0
- qca/forward/types/tool_param.py +21 -0
- qca/forward/types/vault.py +18 -0
- qca/forward/types/vault_create_params.py +13 -0
- qca/forward/types/vault_credential.py +22 -0
- qca/forward/types/vault_credential_auth.py +12 -0
- qca/forward/types/vault_credential_create_params.py +14 -0
- qca/forward/types/vault_credential_list_params.py +15 -0
- qca/forward/types/vault_list_params.py +15 -0
- qca/managed/__init__.py +7 -0
- qca/managed/_client.py +115 -0
- qca/managed/resources/__init__.py +10 -0
- qca/managed/resources/agents/__init__.py +4 -0
- qca/managed/resources/agents/agents.py +386 -0
- qca/managed/resources/agents/versions.py +71 -0
- qca/managed/resources/deployment_runs.py +160 -0
- qca/managed/resources/deployments.py +552 -0
- qca/managed/resources/dreams.py +303 -0
- qca/managed/resources/environments/__init__.py +4 -0
- qca/managed/resources/environments/environments.py +359 -0
- qca/managed/resources/environments/work.py +449 -0
- qca/managed/resources/files.py +295 -0
- qca/managed/resources/memory_stores/__init__.py +6 -0
- qca/managed/resources/memory_stores/memories.py +358 -0
- qca/managed/resources/memory_stores/memory_stores.py +362 -0
- qca/managed/resources/memory_stores/memory_versions.py +228 -0
- qca/managed/resources/models.py +71 -0
- qca/managed/resources/sessions/__init__.py +6 -0
- qca/managed/resources/sessions/events.py +240 -0
- qca/managed/resources/sessions/resources.py +303 -0
- qca/managed/resources/sessions/sessions.py +472 -0
- qca/managed/resources/sessions/threads/__init__.py +4 -0
- qca/managed/resources/sessions/threads/events.py +141 -0
- qca/managed/resources/sessions/threads/threads.py +185 -0
- qca/managed/resources/skills/__init__.py +4 -0
- qca/managed/resources/skills/skills.py +254 -0
- qca/managed/resources/skills/versions.py +273 -0
- qca/managed/resources/vaults/__init__.py +4 -0
- qca/managed/resources/vaults/credentials.py +437 -0
- qca/managed/resources/vaults/vaults.py +296 -0
- qca/managed/types/__init__.py +421 -0
- qca/managed/types/actor_union.py +15 -0
- qca/managed/types/advisor_params.py +12 -0
- qca/managed/types/agent.py +33 -0
- qca/managed/types/agent_archive_params.py +12 -0
- qca/managed/types/agent_create_params.py +31 -0
- qca/managed/types/agent_list_params.py +18 -0
- qca/managed/types/agent_mcp_tool_result_event_content_union.py +21 -0
- qca/managed/types/agent_message_event_content_union.py +12 -0
- qca/managed/types/agent_params.py +13 -0
- qca/managed/types/agent_reference.py +13 -0
- qca/managed/types/agent_retrieve_params.py +13 -0
- qca/managed/types/agent_skill_union.py +13 -0
- qca/managed/types/agent_thread_message_received_event_content_union.py +20 -0
- qca/managed/types/agent_thread_message_received_event_content_union_source.py +15 -0
- qca/managed/types/agent_thread_message_sent_event_content_union.py +18 -0
- qca/managed/types/agent_thread_message_sent_event_content_union_source.py +15 -0
- qca/managed/types/agent_tool_config_union.py +22 -0
- qca/managed/types/agent_tool_config_union_permission_policy.py +11 -0
- qca/managed/types/agent_tool_result_event_content_union.py +21 -0
- qca/managed/types/agent_tool_union.py +25 -0
- qca/managed/types/agent_tool_union_default_config.py +15 -0
- qca/managed/types/agent_tool_union_default_config_permission_policy.py +11 -0
- qca/managed/types/agent_toolset20260401_params.py +37 -0
- qca/managed/types/agent_toolset_default_config_params.py +16 -0
- qca/managed/types/agent_update_params.py +32 -0
- qca/managed/types/agent_version_list_params.py +14 -0
- qca/managed/types/agent_with_overrides_params.py +27 -0
- qca/managed/types/always_allow_policy_param.py +11 -0
- qca/managed/types/always_ask_policy_param.py +11 -0
- qca/managed/types/base64_document_source_param.py +13 -0
- qca/managed/types/base64_image_source_param.py +13 -0
- qca/managed/types/bash_tool_config_params.py +18 -0
- qca/managed/types/branch_checkout_param.py +12 -0
- qca/managed/types/budget_limit.py +15 -0
- qca/managed/types/budget_limit_param.py +15 -0
- qca/managed/types/cache_creation_usage.py +12 -0
- qca/managed/types/capability_support.py +11 -0
- qca/managed/types/cloud_config_networking_union.py +14 -0
- qca/managed/types/cloud_config_params.py +19 -0
- qca/managed/types/commit_checkout_param.py +12 -0
- qca/managed/types/context_management_capability.py +17 -0
- qca/managed/types/credential.py +23 -0
- qca/managed/types/credential_auth_union.py +23 -0
- qca/managed/types/credential_validation.py +23 -0
- qca/managed/types/custom_skill_params.py +13 -0
- qca/managed/types/custom_tool_input_schema.py +13 -0
- qca/managed/types/custom_tool_input_schema_param.py +13 -0
- qca/managed/types/custom_tool_params.py +17 -0
- qca/managed/types/delete_session_resource.py +12 -0
- qca/managed/types/deleted_credential.py +12 -0
- qca/managed/types/deleted_file.py +12 -0
- qca/managed/types/deleted_memory.py +12 -0
- qca/managed/types/deleted_memory_store.py +12 -0
- qca/managed/types/deleted_session.py +12 -0
- qca/managed/types/deleted_skill.py +12 -0
- qca/managed/types/deleted_skill_version.py +12 -0
- qca/managed/types/deleted_vault.py +12 -0
- qca/managed/types/delta_content.py +16 -0
- qca/managed/types/deployment.py +37 -0
- qca/managed/types/deployment_archive_params.py +12 -0
- qca/managed/types/deployment_create_params.py +36 -0
- qca/managed/types/deployment_initial_event_union.py +20 -0
- qca/managed/types/deployment_list_params.py +22 -0
- qca/managed/types/deployment_pause_params.py +12 -0
- qca/managed/types/deployment_paused_reason_error_union.py +11 -0
- qca/managed/types/deployment_paused_reason_union.py +15 -0
- qca/managed/types/deployment_retrieve_params.py +12 -0
- qca/managed/types/deployment_run.py +24 -0
- qca/managed/types/deployment_run_error_union.py +12 -0
- qca/managed/types/deployment_run_list_params.py +24 -0
- qca/managed/types/deployment_run_params.py +12 -0
- qca/managed/types/deployment_run_retrieve_params.py +12 -0
- qca/managed/types/deployment_unpause_params.py +12 -0
- qca/managed/types/deployment_update_params.py +34 -0
- qca/managed/types/deployment_user_define_outcome_event_rubric_union.py +13 -0
- qca/managed/types/deployment_user_message_event_content_union.py +18 -0
- qca/managed/types/deployment_user_message_event_content_union_source.py +15 -0
- qca/managed/types/document_block_param.py +22 -0
- qca/managed/types/dream.py +33 -0
- qca/managed/types/dream_archive_params.py +12 -0
- qca/managed/types/dream_cancel_params.py +12 -0
- qca/managed/types/dream_create_params.py +23 -0
- qca/managed/types/dream_error.py +12 -0
- qca/managed/types/dream_input_union.py +13 -0
- qca/managed/types/dream_list_params.py +19 -0
- qca/managed/types/dream_memory_store_input_param.py +12 -0
- qca/managed/types/dream_model_config.py +12 -0
- qca/managed/types/dream_model_config_param.py +12 -0
- qca/managed/types/dream_output.py +12 -0
- qca/managed/types/dream_retrieve_params.py +12 -0
- qca/managed/types/dream_sessions_input_param.py +12 -0
- qca/managed/types/dream_usage.py +14 -0
- qca/managed/types/edit_tool_config_params.py +18 -0
- qca/managed/types/effort_capability.py +19 -0
- qca/managed/types/effort_high_param.py +11 -0
- qca/managed/types/effort_low_param.py +11 -0
- qca/managed/types/effort_max_param.py +11 -0
- qca/managed/types/effort_medium_param.py +11 -0
- qca/managed/types/effort_xhigh_param.py +11 -0
- qca/managed/types/environment.py +23 -0
- qca/managed/types/environment_archive_params.py +12 -0
- qca/managed/types/environment_config_union.py +17 -0
- qca/managed/types/environment_create_params.py +21 -0
- qca/managed/types/environment_delete_params.py +12 -0
- qca/managed/types/environment_delete_response.py +12 -0
- qca/managed/types/environment_list_params.py +18 -0
- qca/managed/types/environment_retrieve_params.py +12 -0
- qca/managed/types/environment_update_params.py +21 -0
- qca/managed/types/environment_variable_auth_response_networking_union.py +12 -0
- qca/managed/types/environment_variable_create_params.py +20 -0
- qca/managed/types/environment_variable_update_params.py +19 -0
- qca/managed/types/environment_work_ack_params.py +11 -0
- qca/managed/types/environment_work_heartbeat_params.py +13 -0
- qca/managed/types/environment_work_list_params.py +15 -0
- qca/managed/types/environment_work_poll_params.py +14 -0
- qca/managed/types/environment_work_retrieve_params.py +12 -0
- qca/managed/types/environment_work_stats_params.py +12 -0
- qca/managed/types/environment_work_stop_params.py +13 -0
- qca/managed/types/environment_work_update_params.py +13 -0
- qca/managed/types/file_delete_params.py +12 -0
- qca/managed/types/file_document_source_param.py +12 -0
- qca/managed/types/file_download_params.py +12 -0
- qca/managed/types/file_get_metadata_params.py +12 -0
- qca/managed/types/file_image_source_param.py +12 -0
- qca/managed/types/file_list_params.py +19 -0
- qca/managed/types/file_metadata.py +25 -0
- qca/managed/types/file_resource.py +17 -0
- qca/managed/types/file_resource_params.py +13 -0
- qca/managed/types/file_rubric_params.py +12 -0
- qca/managed/types/file_scope.py +12 -0
- qca/managed/types/file_upload_params.py +18 -0
- qca/managed/types/git_hub_repository_resource_checkout_union.py +13 -0
- qca/managed/types/git_hub_repository_resource_config_checkout_union.py +13 -0
- qca/managed/types/git_hub_repository_resource_params.py +19 -0
- qca/managed/types/glob_tool_config_params.py +18 -0
- qca/managed/types/grep_tool_config_params.py +18 -0
- qca/managed/types/image_block_param.py +17 -0
- qca/managed/types/injection_location_params.py +12 -0
- qca/managed/types/injection_location_response.py +12 -0
- qca/managed/types/injection_location_update_params.py +12 -0
- qca/managed/types/limited_credential_networking_params.py +12 -0
- qca/managed/types/limited_network_params.py +14 -0
- qca/managed/types/mcp_probe.py +15 -0
- qca/managed/types/mcp_server_url_definition.py +13 -0
- qca/managed/types/mcp_tool_config.py +16 -0
- qca/managed/types/mcp_tool_config_params.py +17 -0
- qca/managed/types/mcp_tool_config_permission_policy_union.py +11 -0
- qca/managed/types/mcp_toolset_default_config_params.py +16 -0
- qca/managed/types/mcp_toolset_params.py +18 -0
- qca/managed/types/mcpo_auth_create_params.py +19 -0
- qca/managed/types/mcpo_auth_refresh_params.py +23 -0
- qca/managed/types/mcpo_auth_refresh_response.py +18 -0
- qca/managed/types/mcpo_auth_refresh_response_token_endpoint_auth_union.py +11 -0
- qca/managed/types/mcpo_auth_refresh_update_params.py +17 -0
- qca/managed/types/mcpo_auth_update_params.py +18 -0
- qca/managed/types/memory.py +22 -0
- qca/managed/types/memory_list_item_union.py +21 -0
- qca/managed/types/memory_store.py +19 -0
- qca/managed/types/memory_store_archive_params.py +12 -0
- qca/managed/types/memory_store_create_params.py +15 -0
- qca/managed/types/memory_store_delete_params.py +12 -0
- qca/managed/types/memory_store_list_params.py +19 -0
- qca/managed/types/memory_store_memory_create_params.py +16 -0
- qca/managed/types/memory_store_memory_delete_params.py +13 -0
- qca/managed/types/memory_store_memory_list_params.py +17 -0
- qca/managed/types/memory_store_memory_retrieve_params.py +13 -0
- qca/managed/types/memory_store_memory_update_params.py +21 -0
- qca/managed/types/memory_store_memory_version_list_params.py +23 -0
- qca/managed/types/memory_store_memory_version_redact_params.py +12 -0
- qca/managed/types/memory_store_memory_version_retrieve_params.py +13 -0
- qca/managed/types/memory_store_resource_param.py +14 -0
- qca/managed/types/memory_store_retrieve_params.py +12 -0
- qca/managed/types/memory_store_update_params.py +15 -0
- qca/managed/types/memory_version.py +27 -0
- qca/managed/types/model_capabilities.py +25 -0
- qca/managed/types/model_config.py +18 -0
- qca/managed/types/model_config_effort_union.py +11 -0
- qca/managed/types/model_config_params.py +39 -0
- qca/managed/types/model_info.py +30 -0
- qca/managed/types/model_list_params.py +15 -0
- qca/managed/types/monetary_amount.py +12 -0
- qca/managed/types/monetary_amount_param.py +12 -0
- qca/managed/types/multiagent.py +15 -0
- qca/managed/types/multiagent_agent_union.py +17 -0
- qca/managed/types/multiagent_params.py +17 -0
- qca/managed/types/multiagent_self_params.py +11 -0
- qca/managed/types/outcome_evaluation_resource.py +18 -0
- qca/managed/types/output_behavior_create_new_param.py +11 -0
- qca/managed/types/output_behavior_union.py +12 -0
- qca/managed/types/output_behavior_update_existing_param.py +12 -0
- qca/managed/types/packages.py +17 -0
- qca/managed/types/packages_params.py +17 -0
- qca/managed/types/plain_text_document_source_param.py +13 -0
- qca/managed/types/precondition_param.py +12 -0
- qca/managed/types/qoder_skill_params.py +13 -0
- qca/managed/types/read_tool_config_params.py +18 -0
- qca/managed/types/redacted_block_param.py +11 -0
- qca/managed/types/refresh_http_response.py +14 -0
- qca/managed/types/refresh_object.py +15 -0
- qca/managed/types/schedule.py +16 -0
- qca/managed/types/schedule_params.py +13 -0
- qca/managed/types/search_result_block_param.py +19 -0
- qca/managed/types/search_result_citations.py +11 -0
- qca/managed/types/search_result_citations_param.py +9 -0
- qca/managed/types/search_result_content.py +12 -0
- qca/managed/types/search_result_content_param.py +12 -0
- qca/managed/types/self_hosted_config_params.py +11 -0
- qca/managed/types/self_hosted_work.py +26 -0
- qca/managed/types/self_hosted_work_heartbeat_response.py +15 -0
- qca/managed/types/self_hosted_work_queue_stats.py +15 -0
- qca/managed/types/send_session_events.py +14 -0
- qca/managed/types/send_session_events_data_union.py +39 -0
- qca/managed/types/server_tool_usage.py +12 -0
- qca/managed/types/session.py +37 -0
- qca/managed/types/session_agent.py +28 -0
- qca/managed/types/session_agent_skill_union.py +13 -0
- qca/managed/types/session_agent_tool_union.py +25 -0
- qca/managed/types/session_agent_tool_union_default_config.py +17 -0
- qca/managed/types/session_agent_tool_union_default_config_permission_policy.py +11 -0
- qca/managed/types/session_agent_update_param.py +24 -0
- qca/managed/types/session_archive_params.py +12 -0
- qca/managed/types/session_create_params.py +31 -0
- qca/managed/types/session_delete_params.py +12 -0
- qca/managed/types/session_error_event_error_union.py +19 -0
- qca/managed/types/session_error_event_error_union_retry_status.py +11 -0
- qca/managed/types/session_event.py +77 -0
- qca/managed/types/session_event_list_params.py +23 -0
- qca/managed/types/session_event_send_params.py +34 -0
- qca/managed/types/session_event_stop_reason.py +12 -0
- qca/managed/types/session_event_stream_params.py +13 -0
- qca/managed/types/session_event_usage.py +24 -0
- qca/managed/types/session_list_params.py +26 -0
- qca/managed/types/session_multiagent_coordinator.py +15 -0
- qca/managed/types/session_multiagent_coordinator_agent_union.py +26 -0
- qca/managed/types/session_resource_add_params.py +15 -0
- qca/managed/types/session_resource_config_union.py +21 -0
- qca/managed/types/session_resource_delete_params.py +12 -0
- qca/managed/types/session_resource_get_response_union.py +27 -0
- qca/managed/types/session_resource_list_params.py +16 -0
- qca/managed/types/session_resource_retrieve_params.py +12 -0
- qca/managed/types/session_resource_union.py +27 -0
- qca/managed/types/session_resource_update_params.py +14 -0
- qca/managed/types/session_resource_update_response_union.py +27 -0
- qca/managed/types/session_retrieve_params.py +12 -0
- qca/managed/types/session_stats.py +12 -0
- qca/managed/types/session_stream_event.py +82 -0
- qca/managed/types/session_stream_event_stop_reason.py +12 -0
- qca/managed/types/session_stream_event_usage.py +24 -0
- qca/managed/types/session_thread.py +27 -0
- qca/managed/types/session_thread_agent_skill_union.py +13 -0
- qca/managed/types/session_thread_agent_tool_union.py +25 -0
- qca/managed/types/session_thread_agent_tool_union_default_config.py +17 -0
- qca/managed/types/session_thread_agent_tool_union_default_config_permission_policy.py +11 -0
- qca/managed/types/session_thread_agent_union.py +26 -0
- qca/managed/types/session_thread_archive_params.py +12 -0
- qca/managed/types/session_thread_event_list_params.py +16 -0
- qca/managed/types/session_thread_event_stream_params.py +13 -0
- qca/managed/types/session_thread_list_params.py +14 -0
- qca/managed/types/session_thread_retrieve_params.py +12 -0
- qca/managed/types/session_thread_stats.py +13 -0
- qca/managed/types/session_thread_usage.py +22 -0
- qca/managed/types/session_update_params.py +22 -0
- qca/managed/types/session_usage.py +22 -0
- qca/managed/types/session_work_data.py +12 -0
- qca/managed/types/skill.py +22 -0
- qca/managed/types/skill_create_params.py +17 -0
- qca/managed/types/skill_delete_params.py +12 -0
- qca/managed/types/skill_list_params.py +19 -0
- qca/managed/types/skill_retrieve_params.py +12 -0
- qca/managed/types/skill_source.py +11 -0
- qca/managed/types/skill_version.py +19 -0
- qca/managed/types/skill_version_create_params.py +15 -0
- qca/managed/types/skill_version_delete_params.py +12 -0
- qca/managed/types/skill_version_download_params.py +12 -0
- qca/managed/types/skill_version_list_params.py +14 -0
- qca/managed/types/skill_version_retrieve_params.py +12 -0
- qca/managed/types/span_model_usage.py +15 -0
- qca/managed/types/start_event_preview_union.py +12 -0
- qca/managed/types/static_bearer_create_params.py +13 -0
- qca/managed/types/static_bearer_update_params.py +12 -0
- qca/managed/types/stream_session_thread_events_union.py +82 -0
- qca/managed/types/stream_session_thread_events_union_stop_reason.py +12 -0
- qca/managed/types/stream_session_thread_events_union_usage.py +24 -0
- qca/managed/types/system_content_block.py +12 -0
- qca/managed/types/system_content_block_param.py +12 -0
- qca/managed/types/system_message_event_params.py +15 -0
- qca/managed/types/text_block.py +12 -0
- qca/managed/types/text_block_param.py +12 -0
- qca/managed/types/text_rubric_params.py +12 -0
- qca/managed/types/thinking_capability.py +15 -0
- qca/managed/types/thinking_types.py +15 -0
- qca/managed/types/token_endpoint_auth_basic_param.py +12 -0
- qca/managed/types/token_endpoint_auth_basic_update_param.py +12 -0
- qca/managed/types/token_endpoint_auth_none_param.py +11 -0
- qca/managed/types/token_endpoint_auth_post_param.py +12 -0
- qca/managed/types/token_endpoint_auth_post_update_param.py +12 -0
- qca/managed/types/trigger_context_union.py +13 -0
- qca/managed/types/unrestricted_credential_networking_params.py +11 -0
- qca/managed/types/unrestricted_network_param.py +11 -0
- qca/managed/types/url_document_source_param.py +12 -0
- qca/managed/types/url_image_source_param.py +12 -0
- qca/managed/types/urlmcp_server_params.py +13 -0
- qca/managed/types/user_custom_tool_result_event_content_union.py +21 -0
- qca/managed/types/user_custom_tool_result_event_params.py +20 -0
- qca/managed/types/user_define_outcome_event_params.py +18 -0
- qca/managed/types/user_define_outcome_event_rubric_union.py +13 -0
- qca/managed/types/user_interrupt_event_params.py +12 -0
- qca/managed/types/user_location.py +15 -0
- qca/managed/types/user_location_param.py +15 -0
- qca/managed/types/user_message_event_content_union.py +18 -0
- qca/managed/types/user_message_event_content_union_source.py +15 -0
- qca/managed/types/user_message_event_params.py +18 -0
- qca/managed/types/user_tool_confirmation_event_params.py +14 -0
- qca/managed/types/user_tool_result_event_content_union.py +21 -0
- qca/managed/types/user_tool_result_event_params.py +20 -0
- qca/managed/types/vault.py +18 -0
- qca/managed/types/vault_archive_params.py +12 -0
- qca/managed/types/vault_create_params.py +14 -0
- qca/managed/types/vault_credential_archive_params.py +12 -0
- qca/managed/types/vault_credential_create_params.py +20 -0
- qca/managed/types/vault_credential_delete_params.py +12 -0
- qca/managed/types/vault_credential_list_params.py +18 -0
- qca/managed/types/vault_credential_mcpo_auth_validate_params.py +12 -0
- qca/managed/types/vault_credential_retrieve_params.py +12 -0
- qca/managed/types/vault_credential_update_params.py +19 -0
- qca/managed/types/vault_delete_params.py +12 -0
- qca/managed/types/vault_list_params.py +18 -0
- qca/managed/types/vault_retrieve_params.py +12 -0
- qca/managed/types/web_fetch_tool_config_params.py +21 -0
- qca/managed/types/web_search_tool_config_params.py +22 -0
- qca/managed/types/write_tool_config_params.py +18 -0
- qca/py.typed +0 -0
- qca-0.0.1.dev1.dist-info/METADATA +279 -0
- qca-0.0.1.dev1.dist-info/RECORD +596 -0
- qca-0.0.1.dev1.dist-info/WHEEL +5 -0
- qca-0.0.1.dev1.dist-info/licenses/LICENSE +21 -0
- qca-0.0.1.dev1.dist-info/top_level.txt +1 -0
qca/common/_models.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel as PydanticBaseModel
|
|
6
|
+
from pydantic import ConfigDict, PrivateAttr, TypeAdapter, ValidationError
|
|
7
|
+
|
|
8
|
+
from ._exceptions import APIResponseValidationError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BaseModel(PydanticBaseModel):
|
|
12
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True, protected_namespaces=(), defer_build=True)
|
|
13
|
+
_request_id: str | None = PrivateAttr(default=None)
|
|
14
|
+
|
|
15
|
+
def to_dict(
|
|
16
|
+
self, *, mode: str = "python", use_api_names: bool = True, exclude_unset: bool = True
|
|
17
|
+
) -> dict[str, Any]:
|
|
18
|
+
return self.model_dump(mode=mode, by_alias=use_api_names, exclude_unset=exclude_unset)
|
|
19
|
+
|
|
20
|
+
def to_json(self, *, indent: int | None = 2, use_api_names: bool = True, exclude_unset: bool = True) -> str:
|
|
21
|
+
return self.model_dump_json(indent=indent, by_alias=use_api_names, exclude_unset=exclude_unset)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def parse_response(cast_to: Any, data: Any, response: Any) -> Any:
|
|
25
|
+
if cast_to is None or cast_to is type(None):
|
|
26
|
+
return None
|
|
27
|
+
try:
|
|
28
|
+
result = TypeAdapter(cast_to).validate_python(data)
|
|
29
|
+
except (ValidationError, ValueError) as exc:
|
|
30
|
+
raise APIResponseValidationError(response=response, body=data) from exc
|
|
31
|
+
if isinstance(result, BaseModel):
|
|
32
|
+
result._request_id = response.headers.get("x-request-id") or response.headers.get("request-id")
|
|
33
|
+
return result
|
qca/common/_resource.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from ._response import RawResponseResource
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from ._base_client import AsyncAPIClient, SyncAPIClient
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SyncAPIResource:
|
|
13
|
+
def __init__(self, client: SyncAPIClient) -> None:
|
|
14
|
+
self._client = client
|
|
15
|
+
|
|
16
|
+
@cached_property
|
|
17
|
+
def with_raw_response(self) -> RawResponseResource:
|
|
18
|
+
return RawResponseResource(self)
|
|
19
|
+
|
|
20
|
+
@cached_property
|
|
21
|
+
def with_streaming_response(self) -> RawResponseResource:
|
|
22
|
+
return RawResponseResource(self, streaming=True)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AsyncAPIResource:
|
|
26
|
+
def __init__(self, client: AsyncAPIClient) -> None:
|
|
27
|
+
self._client = client
|
|
28
|
+
|
|
29
|
+
@cached_property
|
|
30
|
+
def with_raw_response(self) -> RawResponseResource:
|
|
31
|
+
return RawResponseResource(self)
|
|
32
|
+
|
|
33
|
+
@cached_property
|
|
34
|
+
def with_streaming_response(self) -> RawResponseResource:
|
|
35
|
+
return RawResponseResource(self, streaming=True)
|
qca/common/_response.py
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterator, Iterator
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any, Callable, Generic, TypeVar
|
|
6
|
+
|
|
7
|
+
import anyio
|
|
8
|
+
import httpx
|
|
9
|
+
|
|
10
|
+
from ._exceptions import APIConnectionError, APITimeoutError
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def read_response(response: httpx.Response) -> bytes:
|
|
16
|
+
try:
|
|
17
|
+
return response.read()
|
|
18
|
+
except httpx.TimeoutException as exc:
|
|
19
|
+
raise APITimeoutError(request=response.request) from exc
|
|
20
|
+
except httpx.TransportError as exc:
|
|
21
|
+
raise APIConnectionError(request=response.request) from exc
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def aread_response(response: httpx.Response) -> bytes:
|
|
25
|
+
try:
|
|
26
|
+
return await response.aread()
|
|
27
|
+
except httpx.TimeoutException as exc:
|
|
28
|
+
raise APITimeoutError(request=response.request) from exc
|
|
29
|
+
except httpx.TransportError as exc:
|
|
30
|
+
raise APIConnectionError(request=response.request) from exc
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class APIResponse(Generic[T]):
|
|
34
|
+
def __init__(self, response: httpx.Response, parse: Callable[[], T]) -> None:
|
|
35
|
+
self.http_response = response
|
|
36
|
+
self._parse = parse
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def headers(self) -> httpx.Headers:
|
|
40
|
+
return self.http_response.headers
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def status_code(self) -> int:
|
|
44
|
+
return self.http_response.status_code
|
|
45
|
+
|
|
46
|
+
def parse(self) -> T:
|
|
47
|
+
self.read()
|
|
48
|
+
return self._parse()
|
|
49
|
+
|
|
50
|
+
def read(self) -> bytes:
|
|
51
|
+
return read_response(self.http_response)
|
|
52
|
+
|
|
53
|
+
def iter_bytes(self, chunk_size: int | None = None) -> Iterator[bytes]:
|
|
54
|
+
return self.http_response.iter_bytes(chunk_size)
|
|
55
|
+
|
|
56
|
+
def iter_lines(self) -> Iterator[str]:
|
|
57
|
+
return self.http_response.iter_lines()
|
|
58
|
+
|
|
59
|
+
def close(self) -> None:
|
|
60
|
+
self.http_response.close()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class AsyncAPIResponse(Generic[T]):
|
|
64
|
+
def __init__(self, response: httpx.Response, parse: Callable[[], T]) -> None:
|
|
65
|
+
self.http_response = response
|
|
66
|
+
self._parse = parse
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def headers(self) -> httpx.Headers:
|
|
70
|
+
return self.http_response.headers
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def status_code(self) -> int:
|
|
74
|
+
return self.http_response.status_code
|
|
75
|
+
|
|
76
|
+
async def parse(self) -> T:
|
|
77
|
+
await self.read()
|
|
78
|
+
return self._parse()
|
|
79
|
+
|
|
80
|
+
async def read(self) -> bytes:
|
|
81
|
+
return await aread_response(self.http_response)
|
|
82
|
+
|
|
83
|
+
async def iter_bytes(self, chunk_size: int | None = None) -> AsyncIterator[bytes]:
|
|
84
|
+
async for chunk in self.http_response.aiter_bytes(chunk_size):
|
|
85
|
+
yield chunk
|
|
86
|
+
|
|
87
|
+
async def iter_lines(self) -> AsyncIterator[str]:
|
|
88
|
+
async for line in self.http_response.aiter_lines():
|
|
89
|
+
yield line
|
|
90
|
+
|
|
91
|
+
async def close(self) -> None:
|
|
92
|
+
await self.http_response.aclose()
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class BinaryAPIResponse:
|
|
96
|
+
"""A streaming download. Close it explicitly or use a context manager."""
|
|
97
|
+
|
|
98
|
+
def __init__(self, response: httpx.Response) -> None:
|
|
99
|
+
self.http_response = response
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def headers(self) -> httpx.Headers:
|
|
103
|
+
return self.http_response.headers
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def status_code(self) -> int:
|
|
107
|
+
return self.http_response.status_code
|
|
108
|
+
|
|
109
|
+
def read(self) -> bytes:
|
|
110
|
+
return read_response(self.http_response)
|
|
111
|
+
|
|
112
|
+
def iter_bytes(self, chunk_size: int | None = None) -> Iterator[bytes]:
|
|
113
|
+
return self.http_response.iter_bytes(chunk_size)
|
|
114
|
+
|
|
115
|
+
def write_to_file(self, path: str | Path) -> None:
|
|
116
|
+
try:
|
|
117
|
+
with Path(path).open("wb") as output:
|
|
118
|
+
for chunk in self.iter_bytes():
|
|
119
|
+
output.write(chunk)
|
|
120
|
+
finally:
|
|
121
|
+
self.close()
|
|
122
|
+
|
|
123
|
+
def close(self) -> None:
|
|
124
|
+
self.http_response.close()
|
|
125
|
+
|
|
126
|
+
def __enter__(self) -> BinaryAPIResponse:
|
|
127
|
+
return self
|
|
128
|
+
|
|
129
|
+
def __exit__(self, *_: object) -> None:
|
|
130
|
+
self.close()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class AsyncBinaryAPIResponse:
|
|
134
|
+
def __init__(self, response: httpx.Response) -> None:
|
|
135
|
+
self.http_response = response
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def headers(self) -> httpx.Headers:
|
|
139
|
+
return self.http_response.headers
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def status_code(self) -> int:
|
|
143
|
+
return self.http_response.status_code
|
|
144
|
+
|
|
145
|
+
async def read(self) -> bytes:
|
|
146
|
+
return await aread_response(self.http_response)
|
|
147
|
+
|
|
148
|
+
async def iter_bytes(self, chunk_size: int | None = None) -> AsyncIterator[bytes]:
|
|
149
|
+
async for chunk in self.http_response.aiter_bytes(chunk_size):
|
|
150
|
+
yield chunk
|
|
151
|
+
|
|
152
|
+
async def write_to_file(self, path: str | Path) -> None:
|
|
153
|
+
try:
|
|
154
|
+
async with await anyio.open_file(path, "wb") as output:
|
|
155
|
+
async for chunk in self.iter_bytes():
|
|
156
|
+
await output.write(chunk)
|
|
157
|
+
finally:
|
|
158
|
+
await self.close()
|
|
159
|
+
|
|
160
|
+
async def close(self) -> None:
|
|
161
|
+
await self.http_response.aclose()
|
|
162
|
+
|
|
163
|
+
async def __aenter__(self) -> AsyncBinaryAPIResponse:
|
|
164
|
+
return self
|
|
165
|
+
|
|
166
|
+
async def __aexit__(self, *_: object) -> None:
|
|
167
|
+
await self.close()
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class RawResponseResource:
|
|
171
|
+
def __init__(self, resource: Any, *, streaming: bool = False) -> None:
|
|
172
|
+
self._resource = resource
|
|
173
|
+
self._streaming = streaming
|
|
174
|
+
|
|
175
|
+
def __getattr__(self, name: str) -> Any:
|
|
176
|
+
resource = self._resource
|
|
177
|
+
attr = getattr(resource, name)
|
|
178
|
+
if not callable(attr):
|
|
179
|
+
return RawResponseResource(attr, streaming=self._streaming)
|
|
180
|
+
|
|
181
|
+
def wrapped(*args: Any, **kwargs: Any) -> Any:
|
|
182
|
+
# A separate view carries the response mode, avoiding shared mutable
|
|
183
|
+
# flags when the same client is used concurrently.
|
|
184
|
+
view = type(resource)(resource._client._raw_response_view(streaming=self._streaming))
|
|
185
|
+
|
|
186
|
+
def call() -> Any:
|
|
187
|
+
return getattr(view, name)(*args, **kwargs)
|
|
188
|
+
|
|
189
|
+
if self._streaming:
|
|
190
|
+
manager = AsyncResponseContextManager if resource._client._is_async else ResponseContextManager
|
|
191
|
+
return manager(call)
|
|
192
|
+
return call()
|
|
193
|
+
|
|
194
|
+
return wrapped
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class ResponseContextManager:
|
|
198
|
+
def __init__(self, request: Callable[[], Any]) -> None:
|
|
199
|
+
self._request = request
|
|
200
|
+
self.response: Any = None
|
|
201
|
+
|
|
202
|
+
def __enter__(self) -> Any:
|
|
203
|
+
self.response = self._request()
|
|
204
|
+
return self.response
|
|
205
|
+
|
|
206
|
+
def __exit__(self, *_: object) -> None:
|
|
207
|
+
self.response.close()
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class AsyncResponseContextManager:
|
|
211
|
+
def __init__(self, request: Callable[[], Any]) -> None:
|
|
212
|
+
self._request = request
|
|
213
|
+
self.response: Any = None
|
|
214
|
+
|
|
215
|
+
async def __aenter__(self) -> Any:
|
|
216
|
+
self.response = await self._request()
|
|
217
|
+
return self.response
|
|
218
|
+
|
|
219
|
+
async def __aexit__(self, *_: object) -> None:
|
|
220
|
+
await self.response.close()
|
qca/common/_streaming.py
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from collections.abc import AsyncIterator, Iterator
|
|
5
|
+
from typing import Any, Generic, TypeVar
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from ._exceptions import APIConnectionError, APIError, APIResponseValidationError, APITimeoutError
|
|
10
|
+
from ._models import parse_response
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SSEDecoder:
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
self.last_event_id: str | None = None
|
|
18
|
+
self.event: str | None = None
|
|
19
|
+
self.data: list[str] = []
|
|
20
|
+
|
|
21
|
+
def decode(self, line: str) -> tuple[str | None, str] | None:
|
|
22
|
+
if not line:
|
|
23
|
+
result = (self.event, "\n".join(self.data)) if self.data else None
|
|
24
|
+
self.event = None
|
|
25
|
+
self.data = []
|
|
26
|
+
return result
|
|
27
|
+
if line.startswith(":"):
|
|
28
|
+
return None
|
|
29
|
+
field, _, value = line.partition(":")
|
|
30
|
+
if value.startswith(" "):
|
|
31
|
+
value = value[1:]
|
|
32
|
+
if field == "data":
|
|
33
|
+
self.data.append(value)
|
|
34
|
+
elif field == "event":
|
|
35
|
+
self.event = value
|
|
36
|
+
elif field == "id" and "\x00" not in value:
|
|
37
|
+
self.last_event_id = value
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class BaseStream(Generic[T]):
|
|
42
|
+
def __init__(self, response: httpx.Response, cast_to: Any) -> None:
|
|
43
|
+
self.response = response
|
|
44
|
+
self._cast_to = cast_to
|
|
45
|
+
self._decoder = SSEDecoder()
|
|
46
|
+
self._last_event_id: str | None = None
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def last_event_id(self) -> str | None:
|
|
50
|
+
return self._last_event_id
|
|
51
|
+
|
|
52
|
+
def _parse(self, frame: tuple[str | None, str]) -> T:
|
|
53
|
+
event_type, text = frame
|
|
54
|
+
try:
|
|
55
|
+
data = json.loads(text)
|
|
56
|
+
except ValueError as exc:
|
|
57
|
+
raise APIResponseValidationError(response=self.response, body=text) from exc
|
|
58
|
+
if event_type == "error" or (isinstance(data, dict) and data.get("type") == "error"):
|
|
59
|
+
error = data.get("error", data) if isinstance(data, dict) else data
|
|
60
|
+
message = error.get("message", str(error)) if isinstance(error, dict) else str(error)
|
|
61
|
+
raise APIError(message, request=self.response.request, body=data)
|
|
62
|
+
if isinstance(data, dict):
|
|
63
|
+
data = dict(data)
|
|
64
|
+
if event_type:
|
|
65
|
+
data.setdefault("type", event_type)
|
|
66
|
+
if self._decoder.last_event_id:
|
|
67
|
+
data.setdefault("id", self._decoder.last_event_id)
|
|
68
|
+
result = parse_response(self._cast_to, data, self.response)
|
|
69
|
+
# Checkpoint only after a complete frame is parsed, never on a partial ID.
|
|
70
|
+
self._last_event_id = self._decoder.last_event_id
|
|
71
|
+
return result
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class Stream(BaseStream[T], Iterator[T]):
|
|
75
|
+
def __init__(self, response: httpx.Response, cast_to: Any) -> None:
|
|
76
|
+
super().__init__(response, cast_to)
|
|
77
|
+
self._iterator = self._iter_events()
|
|
78
|
+
|
|
79
|
+
def __next__(self) -> T:
|
|
80
|
+
return next(self._iterator)
|
|
81
|
+
|
|
82
|
+
def _iter_events(self) -> Iterator[T]:
|
|
83
|
+
try:
|
|
84
|
+
for line in self.response.iter_lines():
|
|
85
|
+
frame = self._decoder.decode(line)
|
|
86
|
+
if frame is None:
|
|
87
|
+
continue
|
|
88
|
+
if frame[0] == "ping":
|
|
89
|
+
continue
|
|
90
|
+
if frame[1] == "[DONE]":
|
|
91
|
+
return
|
|
92
|
+
yield self._parse(frame)
|
|
93
|
+
except httpx.TimeoutException as exc:
|
|
94
|
+
raise APITimeoutError(request=self.response.request) from exc
|
|
95
|
+
except httpx.TransportError as exc:
|
|
96
|
+
raise APIConnectionError(request=self.response.request) from exc
|
|
97
|
+
finally:
|
|
98
|
+
self.close()
|
|
99
|
+
|
|
100
|
+
def close(self) -> None:
|
|
101
|
+
self.response.close()
|
|
102
|
+
|
|
103
|
+
def __enter__(self) -> Stream[T]:
|
|
104
|
+
return self
|
|
105
|
+
|
|
106
|
+
def __exit__(self, *_: object) -> None:
|
|
107
|
+
self.close()
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class AsyncStream(BaseStream[T], AsyncIterator[T]):
|
|
111
|
+
def __init__(self, response: httpx.Response, cast_to: Any) -> None:
|
|
112
|
+
super().__init__(response, cast_to)
|
|
113
|
+
self._iterator = self._iter_events()
|
|
114
|
+
|
|
115
|
+
async def __anext__(self) -> T:
|
|
116
|
+
return await self._iterator.__anext__()
|
|
117
|
+
|
|
118
|
+
async def _iter_events(self) -> AsyncIterator[T]:
|
|
119
|
+
try:
|
|
120
|
+
async for line in self.response.aiter_lines():
|
|
121
|
+
frame = self._decoder.decode(line)
|
|
122
|
+
if frame is None:
|
|
123
|
+
continue
|
|
124
|
+
if frame[0] == "ping":
|
|
125
|
+
continue
|
|
126
|
+
if frame[1] == "[DONE]":
|
|
127
|
+
return
|
|
128
|
+
yield self._parse(frame)
|
|
129
|
+
except httpx.TimeoutException as exc:
|
|
130
|
+
raise APITimeoutError(request=self.response.request) from exc
|
|
131
|
+
except httpx.TransportError as exc:
|
|
132
|
+
raise APIConnectionError(request=self.response.request) from exc
|
|
133
|
+
finally:
|
|
134
|
+
await self.close()
|
|
135
|
+
|
|
136
|
+
async def close(self) -> None:
|
|
137
|
+
await self.response.aclose()
|
|
138
|
+
|
|
139
|
+
async def __aenter__(self) -> AsyncStream[T]:
|
|
140
|
+
return self
|
|
141
|
+
|
|
142
|
+
async def __aexit__(self, *_: object) -> None:
|
|
143
|
+
await self.close()
|
qca/common/_types.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from os import PathLike
|
|
4
|
+
from typing import IO, Any, Mapping, Union
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class NotGiven:
|
|
8
|
+
"""A missing argument, distinct from an explicitly supplied None."""
|
|
9
|
+
|
|
10
|
+
def __bool__(self) -> bool:
|
|
11
|
+
return False
|
|
12
|
+
|
|
13
|
+
def __repr__(self) -> str:
|
|
14
|
+
return "NOT_GIVEN"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
NOT_GIVEN = NotGiven()
|
|
18
|
+
FileContent = Union[bytes, IO[bytes], PathLike[str]]
|
|
19
|
+
FileTypes = Union[
|
|
20
|
+
FileContent,
|
|
21
|
+
tuple[str, FileContent],
|
|
22
|
+
tuple[str, FileContent, str],
|
|
23
|
+
tuple[str, FileContent, str, Mapping[str, str]],
|
|
24
|
+
]
|
|
25
|
+
Body = Mapping[str, Any]
|
qca/common/_utils.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import date, datetime
|
|
4
|
+
from typing import Any, Mapping
|
|
5
|
+
from urllib.parse import quote
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ._types import NOT_GIVEN, NotGiven
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def strip_not_given(value: Any) -> Any:
|
|
13
|
+
if isinstance(value, BaseModel):
|
|
14
|
+
value = value.model_dump(mode="json", by_alias=True, exclude_unset=True)
|
|
15
|
+
if isinstance(value, Mapping):
|
|
16
|
+
return {k: strip_not_given(v) for k, v in value.items() if not isinstance(v, NotGiven)}
|
|
17
|
+
if isinstance(value, (list, tuple)):
|
|
18
|
+
return [strip_not_given(v) for v in value if not isinstance(v, NotGiven)]
|
|
19
|
+
if isinstance(value, (date, datetime)):
|
|
20
|
+
return value.isoformat()
|
|
21
|
+
return value
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def path_template(path: str, **params: str) -> str:
|
|
25
|
+
for name, value in params.items():
|
|
26
|
+
if not isinstance(value, str) or not value:
|
|
27
|
+
raise ValueError(f"Expected a non-empty string for {name}")
|
|
28
|
+
if value in (".", ".."):
|
|
29
|
+
raise ValueError(f"Invalid path segment for {name}")
|
|
30
|
+
path = path.replace("{" + name + "}", quote(value, safe=""))
|
|
31
|
+
return path
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def make_request_options(
|
|
35
|
+
*,
|
|
36
|
+
body: Mapping[str, Any],
|
|
37
|
+
query: Mapping[str, Any],
|
|
38
|
+
headers: Mapping[str, Any],
|
|
39
|
+
extra_headers: Mapping[str, str] | None,
|
|
40
|
+
extra_query: Mapping[str, Any] | None,
|
|
41
|
+
extra_body: Mapping[str, Any] | None,
|
|
42
|
+
timeout: Any = NOT_GIVEN,
|
|
43
|
+
) -> dict[str, Any]:
|
|
44
|
+
# Preserve tuples and file objects until multipart encoding.
|
|
45
|
+
return {
|
|
46
|
+
"body": {**{k: v for k, v in body.items() if not isinstance(v, NotGiven)}, **(extra_body or {})},
|
|
47
|
+
"query": strip_not_given({**query, **(extra_query or {})}),
|
|
48
|
+
"headers": {
|
|
49
|
+
**{k: v for k, v in headers.items() if not isinstance(v, NotGiven) and v is not None},
|
|
50
|
+
**(extra_headers or {}),
|
|
51
|
+
},
|
|
52
|
+
"timeout": timeout,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def query_pairs(query: Mapping[str, Any]) -> list[tuple[str, str]]:
|
|
57
|
+
pairs: list[tuple[str, str]] = []
|
|
58
|
+
|
|
59
|
+
def add(key: str, value: Any) -> None:
|
|
60
|
+
if value is None or isinstance(value, NotGiven):
|
|
61
|
+
return
|
|
62
|
+
if isinstance(value, Mapping):
|
|
63
|
+
for child, item in value.items():
|
|
64
|
+
add(f"{key}[{child}]", item)
|
|
65
|
+
elif isinstance(value, (list, tuple)):
|
|
66
|
+
for item in value:
|
|
67
|
+
add(key, item)
|
|
68
|
+
else:
|
|
69
|
+
pairs.append((key, str(value).lower() if isinstance(value, bool) else str(value)))
|
|
70
|
+
|
|
71
|
+
for key, value in query.items():
|
|
72
|
+
add(key, value)
|
|
73
|
+
return pairs
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Protocol
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Credential(Protocol):
|
|
7
|
+
def get_token(self) -> str:
|
|
8
|
+
"""Return the current access token. Called for each HTTP attempt."""
|
|
9
|
+
...
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AsyncCredential(Protocol):
|
|
13
|
+
async def get_token(self) -> str: ...
|
qca/common/pagination.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterator, Awaitable, Callable, Iterator
|
|
4
|
+
from typing import Any, Generic, TypeVar
|
|
5
|
+
|
|
6
|
+
from pydantic import Field, PrivateAttr
|
|
7
|
+
|
|
8
|
+
from ._models import BaseModel
|
|
9
|
+
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BasePage(BaseModel, Generic[T]):
|
|
14
|
+
data: list[T] = Field(default_factory=list)
|
|
15
|
+
has_more: bool | None = None
|
|
16
|
+
first_id: str | None = None
|
|
17
|
+
last_id: str | None = None
|
|
18
|
+
next_page: str | None = None
|
|
19
|
+
_query: dict[str, Any] = PrivateAttr(default_factory=dict)
|
|
20
|
+
_style: str = PrivateAttr(default="Page")
|
|
21
|
+
_fetch: Any = PrivateAttr(default=None)
|
|
22
|
+
|
|
23
|
+
def _next_query(self) -> dict[str, Any] | None:
|
|
24
|
+
if self.has_more is False:
|
|
25
|
+
return None
|
|
26
|
+
query = dict(self._query)
|
|
27
|
+
if self._style in ("PageCursor", "BidirectionalPageCursor", "TokenPage"):
|
|
28
|
+
key = "page_token" if self._style == "TokenPage" else "page"
|
|
29
|
+
cursor = self.next_page
|
|
30
|
+
else:
|
|
31
|
+
if not self.data:
|
|
32
|
+
return None
|
|
33
|
+
key = "before_id" if query.get("before_id") else "after_id"
|
|
34
|
+
cursor = self.first_id if key == "before_id" else self.last_id
|
|
35
|
+
if not cursor:
|
|
36
|
+
return None
|
|
37
|
+
if query.get(key) == cursor:
|
|
38
|
+
raise RuntimeError("Pagination cursor did not advance")
|
|
39
|
+
for other in ("after_id", "before_id", "page", "page_token"):
|
|
40
|
+
if other != key:
|
|
41
|
+
query[other] = None
|
|
42
|
+
query[key] = cursor
|
|
43
|
+
return query
|
|
44
|
+
|
|
45
|
+
def has_next_page(self) -> bool:
|
|
46
|
+
return self._next_query() is not None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class SyncPage(BasePage[T]):
|
|
50
|
+
def get_next_page(self) -> SyncPage[T]:
|
|
51
|
+
query = self._next_query()
|
|
52
|
+
if query is None:
|
|
53
|
+
raise RuntimeError("No more pages")
|
|
54
|
+
if self._fetch is None:
|
|
55
|
+
raise RuntimeError("Page is not attached to a client request")
|
|
56
|
+
return self._fetch(query)
|
|
57
|
+
|
|
58
|
+
def iter_pages(self) -> Iterator[SyncPage[T]]:
|
|
59
|
+
page = self
|
|
60
|
+
seen: set[str] = set()
|
|
61
|
+
while True:
|
|
62
|
+
yield page
|
|
63
|
+
query = page._next_query()
|
|
64
|
+
if query is None:
|
|
65
|
+
break
|
|
66
|
+
fingerprint = repr(query)
|
|
67
|
+
if fingerprint in seen:
|
|
68
|
+
raise RuntimeError("Pagination cursor cycle detected")
|
|
69
|
+
seen.add(fingerprint)
|
|
70
|
+
page = page.get_next_page()
|
|
71
|
+
|
|
72
|
+
def __iter__(self) -> Iterator[T]: # type: ignore[override]
|
|
73
|
+
for page in self.iter_pages():
|
|
74
|
+
yield from page.data
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class AsyncPage(BasePage[T]):
|
|
78
|
+
async def get_next_page(self) -> AsyncPage[T]:
|
|
79
|
+
query = self._next_query()
|
|
80
|
+
if query is None:
|
|
81
|
+
raise RuntimeError("No more pages")
|
|
82
|
+
if self._fetch is None:
|
|
83
|
+
raise RuntimeError("Page is not attached to a client request")
|
|
84
|
+
return await self._fetch(query)
|
|
85
|
+
|
|
86
|
+
async def iter_pages(self) -> AsyncIterator[AsyncPage[T]]:
|
|
87
|
+
page = self
|
|
88
|
+
seen: set[str] = set()
|
|
89
|
+
while True:
|
|
90
|
+
yield page
|
|
91
|
+
query = page._next_query()
|
|
92
|
+
if query is None:
|
|
93
|
+
break
|
|
94
|
+
fingerprint = repr(query)
|
|
95
|
+
if fingerprint in seen:
|
|
96
|
+
raise RuntimeError("Pagination cursor cycle detected")
|
|
97
|
+
seen.add(fingerprint)
|
|
98
|
+
page = await page.get_next_page()
|
|
99
|
+
|
|
100
|
+
async def __aiter__(self) -> AsyncIterator[T]:
|
|
101
|
+
async for page in self.iter_pages():
|
|
102
|
+
for item in page.data:
|
|
103
|
+
yield item
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class AsyncPaginator(Generic[T]):
|
|
107
|
+
"""Await the first page, or iterate items directly with async for."""
|
|
108
|
+
|
|
109
|
+
def __init__(self, fetch: Callable[[], Awaitable[AsyncPage[T]]]) -> None:
|
|
110
|
+
self._fetch = fetch
|
|
111
|
+
|
|
112
|
+
def __await__(self) -> Any:
|
|
113
|
+
return self._fetch().__await__()
|
|
114
|
+
|
|
115
|
+
async def __aiter__(self) -> AsyncIterator[T]:
|
|
116
|
+
page = await self._fetch()
|
|
117
|
+
async for item in page:
|
|
118
|
+
yield item
|