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.
Files changed (596) hide show
  1. qca/__init__.py +50 -0
  2. qca/_version.py +1 -0
  3. qca/common/__init__.py +43 -0
  4. qca/common/_base_client.py +450 -0
  5. qca/common/_exceptions.py +97 -0
  6. qca/common/_files.py +38 -0
  7. qca/common/_models.py +33 -0
  8. qca/common/_resource.py +35 -0
  9. qca/common/_response.py +220 -0
  10. qca/common/_streaming.py +143 -0
  11. qca/common/_types.py +25 -0
  12. qca/common/_utils.py +73 -0
  13. qca/common/credentials.py +13 -0
  14. qca/common/pagination.py +118 -0
  15. qca/forward/__init__.py +7 -0
  16. qca/forward/_client.py +142 -0
  17. qca/forward/resources/__init__.py +14 -0
  18. qca/forward/resources/batches/__init__.py +4 -0
  19. qca/forward/resources/batches/batches.py +308 -0
  20. qca/forward/resources/batches/tasks.py +71 -0
  21. qca/forward/resources/channel_pairings.py +111 -0
  22. qca/forward/resources/channels/__init__.py +4 -0
  23. qca/forward/resources/channels/channels.py +336 -0
  24. qca/forward/resources/channels/qr_sessions.py +106 -0
  25. qca/forward/resources/environments.py +305 -0
  26. qca/forward/resources/files.py +272 -0
  27. qca/forward/resources/identities/__init__.py +6 -0
  28. qca/forward/resources/identities/configs.py +249 -0
  29. qca/forward/resources/identities/identities.py +570 -0
  30. qca/forward/resources/identities/memory_stores.py +186 -0
  31. qca/forward/resources/memory_stores/__init__.py +6 -0
  32. qca/forward/resources/memory_stores/memories.py +290 -0
  33. qca/forward/resources/memory_stores/memory_stores.py +321 -0
  34. qca/forward/resources/memory_stores/memory_versions.py +179 -0
  35. qca/forward/resources/models.py +58 -0
  36. qca/forward/resources/schedule_runs.py +149 -0
  37. qca/forward/resources/schedules.py +545 -0
  38. qca/forward/resources/sessions/__init__.py +6 -0
  39. qca/forward/resources/sessions/events.py +208 -0
  40. qca/forward/resources/sessions/resources.py +66 -0
  41. qca/forward/resources/sessions/sessions.py +417 -0
  42. qca/forward/resources/sessions/threads/__init__.py +4 -0
  43. qca/forward/resources/sessions/threads/events.py +128 -0
  44. qca/forward/resources/sessions/threads/threads.py +177 -0
  45. qca/forward/resources/skills/__init__.py +4 -0
  46. qca/forward/resources/skills/skills.py +335 -0
  47. qca/forward/resources/skills/versions.py +253 -0
  48. qca/forward/resources/templates.py +426 -0
  49. qca/forward/resources/vaults/__init__.py +4 -0
  50. qca/forward/resources/vaults/credentials.py +227 -0
  51. qca/forward/resources/vaults/vaults.py +217 -0
  52. qca/forward/types/__init__.py +205 -0
  53. qca/forward/types/batch.py +35 -0
  54. qca/forward/types/batch_cancel_params.py +11 -0
  55. qca/forward/types/batch_create_params.py +14 -0
  56. qca/forward/types/batch_file.py +13 -0
  57. qca/forward/types/batch_list_params.py +14 -0
  58. qca/forward/types/batch_request_counts.py +17 -0
  59. qca/forward/types/batch_task.py +24 -0
  60. qca/forward/types/batch_task_artifacts_item.py +14 -0
  61. qca/forward/types/batch_task_error.py +12 -0
  62. qca/forward/types/batch_task_list_params.py +14 -0
  63. qca/forward/types/batch_task_usage.py +11 -0
  64. qca/forward/types/batch_usage.py +11 -0
  65. qca/forward/types/channel.py +27 -0
  66. qca/forward/types/channel_channel_config.py +14 -0
  67. qca/forward/types/channel_channel_config_response_options.py +12 -0
  68. qca/forward/types/channel_create_params.py +18 -0
  69. qca/forward/types/channel_identity_resolution.py +11 -0
  70. qca/forward/types/channel_list_params.py +18 -0
  71. qca/forward/types/channel_pairing.py +17 -0
  72. qca/forward/types/channel_pairing_create_params.py +14 -0
  73. qca/forward/types/channel_qr_session.py +19 -0
  74. qca/forward/types/channel_qr_session_create_params.py +11 -0
  75. qca/forward/types/channel_update_params.py +16 -0
  76. qca/forward/types/content_block_param.py +17 -0
  77. qca/forward/types/deleted_channel.py +12 -0
  78. qca/forward/types/deleted_channel_pairing.py +12 -0
  79. qca/forward/types/deleted_identity.py +12 -0
  80. qca/forward/types/deleted_memory.py +13 -0
  81. qca/forward/types/deleted_memory_store.py +13 -0
  82. qca/forward/types/deleted_memory_store_mount.py +13 -0
  83. qca/forward/types/deleted_skill_version.py +13 -0
  84. qca/forward/types/effective_config.py +23 -0
  85. qca/forward/types/effective_config_agent.py +19 -0
  86. qca/forward/types/effective_config_agent_tools_item.py +15 -0
  87. qca/forward/types/effective_config_agent_tools_item_configs_item.py +12 -0
  88. qca/forward/types/effective_config_session.py +17 -0
  89. qca/forward/types/effective_config_session_resources_item.py +14 -0
  90. qca/forward/types/environment.py +24 -0
  91. qca/forward/types/environment_config.py +15 -0
  92. qca/forward/types/environment_config_packages.py +17 -0
  93. qca/forward/types/environment_create_params.py +15 -0
  94. qca/forward/types/environment_list_params.py +14 -0
  95. qca/forward/types/environment_update_params.py +14 -0
  96. qca/forward/types/environment_variable_override.py +12 -0
  97. qca/forward/types/environment_variable_override_param.py +12 -0
  98. qca/forward/types/file_list_params.py +16 -0
  99. qca/forward/types/file_metadata.py +22 -0
  100. qca/forward/types/file_upload_params.py +17 -0
  101. qca/forward/types/git_hub_repository.py +13 -0
  102. qca/forward/types/git_hub_repository_param.py +14 -0
  103. qca/forward/types/identity.py +19 -0
  104. qca/forward/types/identity_clear_params.py +11 -0
  105. qca/forward/types/identity_clear_response.py +18 -0
  106. qca/forward/types/identity_clear_response_summary.py +16 -0
  107. qca/forward/types/identity_config.py +25 -0
  108. qca/forward/types/identity_config_list_params.py +15 -0
  109. qca/forward/types/identity_config_spec.py +31 -0
  110. qca/forward/types/identity_config_spec_param.py +31 -0
  111. qca/forward/types/identity_config_upsert_params.py +17 -0
  112. qca/forward/types/identity_create_params.py +15 -0
  113. qca/forward/types/identity_list_params.py +17 -0
  114. qca/forward/types/identity_list_templates_response.py +14 -0
  115. qca/forward/types/identity_memory_store_list_response.py +15 -0
  116. qca/forward/types/identity_memory_store_mount_params.py +9 -0
  117. qca/forward/types/identity_stats.py +14 -0
  118. qca/forward/types/identity_template.py +15 -0
  119. qca/forward/types/identity_update_params.py +15 -0
  120. qca/forward/types/image_source_param.py +15 -0
  121. qca/forward/types/mcp_server.py +13 -0
  122. qca/forward/types/mcp_server_override.py +13 -0
  123. qca/forward/types/mcp_server_override_param.py +13 -0
  124. qca/forward/types/mcp_server_param.py +13 -0
  125. qca/forward/types/memory.py +21 -0
  126. qca/forward/types/memory_store.py +25 -0
  127. qca/forward/types/memory_store_create_params.py +14 -0
  128. qca/forward/types/memory_store_list_params.py +14 -0
  129. qca/forward/types/memory_store_memory_create_params.py +13 -0
  130. qca/forward/types/memory_store_memory_list_params.py +14 -0
  131. qca/forward/types/memory_store_memory_update_params.py +13 -0
  132. qca/forward/types/memory_store_memory_version_list_params.py +14 -0
  133. qca/forward/types/memory_store_mount.py +20 -0
  134. qca/forward/types/memory_store_update_params.py +13 -0
  135. qca/forward/types/memory_version.py +23 -0
  136. qca/forward/types/model.py +23 -0
  137. qca/forward/types/model_config.py +13 -0
  138. qca/forward/types/model_config_param.py +13 -0
  139. qca/forward/types/model_list_response.py +15 -0
  140. qca/forward/types/multiagent_config.py +15 -0
  141. qca/forward/types/multiagent_config_param.py +15 -0
  142. qca/forward/types/multiagent_entry.py +13 -0
  143. qca/forward/types/multiagent_entry_param.py +13 -0
  144. qca/forward/types/permission_policy.py +11 -0
  145. qca/forward/types/permission_policy_param.py +9 -0
  146. qca/forward/types/resource_binding.py +11 -0
  147. qca/forward/types/resource_binding_param.py +11 -0
  148. qca/forward/types/schedule.py +34 -0
  149. qca/forward/types/schedule_archive_many_params.py +12 -0
  150. qca/forward/types/schedule_archive_many_response.py +11 -0
  151. qca/forward/types/schedule_archive_params.py +11 -0
  152. qca/forward/types/schedule_create_params.py +21 -0
  153. qca/forward/types/schedule_execution.py +14 -0
  154. qca/forward/types/schedule_initial_events_item.py +12 -0
  155. qca/forward/types/schedule_list_params.py +19 -0
  156. qca/forward/types/schedule_pause_params.py +11 -0
  157. qca/forward/types/schedule_paused_reason.py +11 -0
  158. qca/forward/types/schedule_run.py +33 -0
  159. qca/forward/types/schedule_run_list_params.py +20 -0
  160. qca/forward/types/schedule_run_params.py +11 -0
  161. qca/forward/types/schedule_run_retrieve_params.py +11 -0
  162. qca/forward/types/schedule_run_trigger_context.py +13 -0
  163. qca/forward/types/schedule_sinks_item.py +16 -0
  164. qca/forward/types/schedule_sinks_item_target.py +12 -0
  165. qca/forward/types/schedule_trigger_policy.py +15 -0
  166. qca/forward/types/schedule_unpause_params.py +11 -0
  167. qca/forward/types/schedule_update_params.py +20 -0
  168. qca/forward/types/session.py +33 -0
  169. qca/forward/types/session_archive_params.py +11 -0
  170. qca/forward/types/session_cancel_params.py +11 -0
  171. qca/forward/types/session_config.py +11 -0
  172. qca/forward/types/session_create_params.py +21 -0
  173. qca/forward/types/session_create_params_config_param.py +11 -0
  174. qca/forward/types/session_event.py +52 -0
  175. qca/forward/types/session_event_list_params.py +18 -0
  176. qca/forward/types/session_event_param.py +24 -0
  177. qca/forward/types/session_event_send_params.py +15 -0
  178. qca/forward/types/session_event_send_response.py +14 -0
  179. qca/forward/types/session_event_stream_params.py +14 -0
  180. qca/forward/types/session_list_params.py +27 -0
  181. qca/forward/types/session_resource.py +17 -0
  182. qca/forward/types/session_resource_add_params.py +13 -0
  183. qca/forward/types/session_resource_spec_param.py +13 -0
  184. qca/forward/types/session_stats.py +12 -0
  185. qca/forward/types/session_template.py +18 -0
  186. qca/forward/types/session_thread.py +27 -0
  187. qca/forward/types/session_thread_archive_params.py +11 -0
  188. qca/forward/types/session_thread_event_list_params.py +13 -0
  189. qca/forward/types/session_thread_event_stream_params.py +11 -0
  190. qca/forward/types/session_thread_list_params.py +13 -0
  191. qca/forward/types/session_thread_stop_reason.py +11 -0
  192. qca/forward/types/session_update_params.py +17 -0
  193. qca/forward/types/session_update_params_config_param.py +11 -0
  194. qca/forward/types/session_usage.py +11 -0
  195. qca/forward/types/skill.py +23 -0
  196. qca/forward/types/skill_binding.py +14 -0
  197. qca/forward/types/skill_binding_param.py +14 -0
  198. qca/forward/types/skill_create_params.py +20 -0
  199. qca/forward/types/skill_list_params.py +17 -0
  200. qca/forward/types/skill_override.py +13 -0
  201. qca/forward/types/skill_override_param.py +13 -0
  202. qca/forward/types/skill_retrieve_params.py +11 -0
  203. qca/forward/types/skill_update_params.py +16 -0
  204. qca/forward/types/skill_version.py +22 -0
  205. qca/forward/types/skill_version_create_params.py +13 -0
  206. qca/forward/types/skill_version_list_params.py +12 -0
  207. qca/forward/types/system_override.py +12 -0
  208. qca/forward/types/system_override_param.py +12 -0
  209. qca/forward/types/template.py +39 -0
  210. qca/forward/types/template_archive_params.py +11 -0
  211. qca/forward/types/template_clone_params.py +13 -0
  212. qca/forward/types/template_create_params.py +35 -0
  213. qca/forward/types/template_list_params.py +14 -0
  214. qca/forward/types/template_update_params.py +35 -0
  215. qca/forward/types/tool.py +21 -0
  216. qca/forward/types/tool_config.py +16 -0
  217. qca/forward/types/tool_config_param.py +16 -0
  218. qca/forward/types/tool_override.py +15 -0
  219. qca/forward/types/tool_override_param.py +15 -0
  220. qca/forward/types/tool_param.py +21 -0
  221. qca/forward/types/vault.py +18 -0
  222. qca/forward/types/vault_create_params.py +13 -0
  223. qca/forward/types/vault_credential.py +22 -0
  224. qca/forward/types/vault_credential_auth.py +12 -0
  225. qca/forward/types/vault_credential_create_params.py +14 -0
  226. qca/forward/types/vault_credential_list_params.py +15 -0
  227. qca/forward/types/vault_list_params.py +15 -0
  228. qca/managed/__init__.py +7 -0
  229. qca/managed/_client.py +115 -0
  230. qca/managed/resources/__init__.py +10 -0
  231. qca/managed/resources/agents/__init__.py +4 -0
  232. qca/managed/resources/agents/agents.py +386 -0
  233. qca/managed/resources/agents/versions.py +71 -0
  234. qca/managed/resources/deployment_runs.py +160 -0
  235. qca/managed/resources/deployments.py +552 -0
  236. qca/managed/resources/dreams.py +303 -0
  237. qca/managed/resources/environments/__init__.py +4 -0
  238. qca/managed/resources/environments/environments.py +359 -0
  239. qca/managed/resources/environments/work.py +449 -0
  240. qca/managed/resources/files.py +295 -0
  241. qca/managed/resources/memory_stores/__init__.py +6 -0
  242. qca/managed/resources/memory_stores/memories.py +358 -0
  243. qca/managed/resources/memory_stores/memory_stores.py +362 -0
  244. qca/managed/resources/memory_stores/memory_versions.py +228 -0
  245. qca/managed/resources/models.py +71 -0
  246. qca/managed/resources/sessions/__init__.py +6 -0
  247. qca/managed/resources/sessions/events.py +240 -0
  248. qca/managed/resources/sessions/resources.py +303 -0
  249. qca/managed/resources/sessions/sessions.py +472 -0
  250. qca/managed/resources/sessions/threads/__init__.py +4 -0
  251. qca/managed/resources/sessions/threads/events.py +141 -0
  252. qca/managed/resources/sessions/threads/threads.py +185 -0
  253. qca/managed/resources/skills/__init__.py +4 -0
  254. qca/managed/resources/skills/skills.py +254 -0
  255. qca/managed/resources/skills/versions.py +273 -0
  256. qca/managed/resources/vaults/__init__.py +4 -0
  257. qca/managed/resources/vaults/credentials.py +437 -0
  258. qca/managed/resources/vaults/vaults.py +296 -0
  259. qca/managed/types/__init__.py +421 -0
  260. qca/managed/types/actor_union.py +15 -0
  261. qca/managed/types/advisor_params.py +12 -0
  262. qca/managed/types/agent.py +33 -0
  263. qca/managed/types/agent_archive_params.py +12 -0
  264. qca/managed/types/agent_create_params.py +31 -0
  265. qca/managed/types/agent_list_params.py +18 -0
  266. qca/managed/types/agent_mcp_tool_result_event_content_union.py +21 -0
  267. qca/managed/types/agent_message_event_content_union.py +12 -0
  268. qca/managed/types/agent_params.py +13 -0
  269. qca/managed/types/agent_reference.py +13 -0
  270. qca/managed/types/agent_retrieve_params.py +13 -0
  271. qca/managed/types/agent_skill_union.py +13 -0
  272. qca/managed/types/agent_thread_message_received_event_content_union.py +20 -0
  273. qca/managed/types/agent_thread_message_received_event_content_union_source.py +15 -0
  274. qca/managed/types/agent_thread_message_sent_event_content_union.py +18 -0
  275. qca/managed/types/agent_thread_message_sent_event_content_union_source.py +15 -0
  276. qca/managed/types/agent_tool_config_union.py +22 -0
  277. qca/managed/types/agent_tool_config_union_permission_policy.py +11 -0
  278. qca/managed/types/agent_tool_result_event_content_union.py +21 -0
  279. qca/managed/types/agent_tool_union.py +25 -0
  280. qca/managed/types/agent_tool_union_default_config.py +15 -0
  281. qca/managed/types/agent_tool_union_default_config_permission_policy.py +11 -0
  282. qca/managed/types/agent_toolset20260401_params.py +37 -0
  283. qca/managed/types/agent_toolset_default_config_params.py +16 -0
  284. qca/managed/types/agent_update_params.py +32 -0
  285. qca/managed/types/agent_version_list_params.py +14 -0
  286. qca/managed/types/agent_with_overrides_params.py +27 -0
  287. qca/managed/types/always_allow_policy_param.py +11 -0
  288. qca/managed/types/always_ask_policy_param.py +11 -0
  289. qca/managed/types/base64_document_source_param.py +13 -0
  290. qca/managed/types/base64_image_source_param.py +13 -0
  291. qca/managed/types/bash_tool_config_params.py +18 -0
  292. qca/managed/types/branch_checkout_param.py +12 -0
  293. qca/managed/types/budget_limit.py +15 -0
  294. qca/managed/types/budget_limit_param.py +15 -0
  295. qca/managed/types/cache_creation_usage.py +12 -0
  296. qca/managed/types/capability_support.py +11 -0
  297. qca/managed/types/cloud_config_networking_union.py +14 -0
  298. qca/managed/types/cloud_config_params.py +19 -0
  299. qca/managed/types/commit_checkout_param.py +12 -0
  300. qca/managed/types/context_management_capability.py +17 -0
  301. qca/managed/types/credential.py +23 -0
  302. qca/managed/types/credential_auth_union.py +23 -0
  303. qca/managed/types/credential_validation.py +23 -0
  304. qca/managed/types/custom_skill_params.py +13 -0
  305. qca/managed/types/custom_tool_input_schema.py +13 -0
  306. qca/managed/types/custom_tool_input_schema_param.py +13 -0
  307. qca/managed/types/custom_tool_params.py +17 -0
  308. qca/managed/types/delete_session_resource.py +12 -0
  309. qca/managed/types/deleted_credential.py +12 -0
  310. qca/managed/types/deleted_file.py +12 -0
  311. qca/managed/types/deleted_memory.py +12 -0
  312. qca/managed/types/deleted_memory_store.py +12 -0
  313. qca/managed/types/deleted_session.py +12 -0
  314. qca/managed/types/deleted_skill.py +12 -0
  315. qca/managed/types/deleted_skill_version.py +12 -0
  316. qca/managed/types/deleted_vault.py +12 -0
  317. qca/managed/types/delta_content.py +16 -0
  318. qca/managed/types/deployment.py +37 -0
  319. qca/managed/types/deployment_archive_params.py +12 -0
  320. qca/managed/types/deployment_create_params.py +36 -0
  321. qca/managed/types/deployment_initial_event_union.py +20 -0
  322. qca/managed/types/deployment_list_params.py +22 -0
  323. qca/managed/types/deployment_pause_params.py +12 -0
  324. qca/managed/types/deployment_paused_reason_error_union.py +11 -0
  325. qca/managed/types/deployment_paused_reason_union.py +15 -0
  326. qca/managed/types/deployment_retrieve_params.py +12 -0
  327. qca/managed/types/deployment_run.py +24 -0
  328. qca/managed/types/deployment_run_error_union.py +12 -0
  329. qca/managed/types/deployment_run_list_params.py +24 -0
  330. qca/managed/types/deployment_run_params.py +12 -0
  331. qca/managed/types/deployment_run_retrieve_params.py +12 -0
  332. qca/managed/types/deployment_unpause_params.py +12 -0
  333. qca/managed/types/deployment_update_params.py +34 -0
  334. qca/managed/types/deployment_user_define_outcome_event_rubric_union.py +13 -0
  335. qca/managed/types/deployment_user_message_event_content_union.py +18 -0
  336. qca/managed/types/deployment_user_message_event_content_union_source.py +15 -0
  337. qca/managed/types/document_block_param.py +22 -0
  338. qca/managed/types/dream.py +33 -0
  339. qca/managed/types/dream_archive_params.py +12 -0
  340. qca/managed/types/dream_cancel_params.py +12 -0
  341. qca/managed/types/dream_create_params.py +23 -0
  342. qca/managed/types/dream_error.py +12 -0
  343. qca/managed/types/dream_input_union.py +13 -0
  344. qca/managed/types/dream_list_params.py +19 -0
  345. qca/managed/types/dream_memory_store_input_param.py +12 -0
  346. qca/managed/types/dream_model_config.py +12 -0
  347. qca/managed/types/dream_model_config_param.py +12 -0
  348. qca/managed/types/dream_output.py +12 -0
  349. qca/managed/types/dream_retrieve_params.py +12 -0
  350. qca/managed/types/dream_sessions_input_param.py +12 -0
  351. qca/managed/types/dream_usage.py +14 -0
  352. qca/managed/types/edit_tool_config_params.py +18 -0
  353. qca/managed/types/effort_capability.py +19 -0
  354. qca/managed/types/effort_high_param.py +11 -0
  355. qca/managed/types/effort_low_param.py +11 -0
  356. qca/managed/types/effort_max_param.py +11 -0
  357. qca/managed/types/effort_medium_param.py +11 -0
  358. qca/managed/types/effort_xhigh_param.py +11 -0
  359. qca/managed/types/environment.py +23 -0
  360. qca/managed/types/environment_archive_params.py +12 -0
  361. qca/managed/types/environment_config_union.py +17 -0
  362. qca/managed/types/environment_create_params.py +21 -0
  363. qca/managed/types/environment_delete_params.py +12 -0
  364. qca/managed/types/environment_delete_response.py +12 -0
  365. qca/managed/types/environment_list_params.py +18 -0
  366. qca/managed/types/environment_retrieve_params.py +12 -0
  367. qca/managed/types/environment_update_params.py +21 -0
  368. qca/managed/types/environment_variable_auth_response_networking_union.py +12 -0
  369. qca/managed/types/environment_variable_create_params.py +20 -0
  370. qca/managed/types/environment_variable_update_params.py +19 -0
  371. qca/managed/types/environment_work_ack_params.py +11 -0
  372. qca/managed/types/environment_work_heartbeat_params.py +13 -0
  373. qca/managed/types/environment_work_list_params.py +15 -0
  374. qca/managed/types/environment_work_poll_params.py +14 -0
  375. qca/managed/types/environment_work_retrieve_params.py +12 -0
  376. qca/managed/types/environment_work_stats_params.py +12 -0
  377. qca/managed/types/environment_work_stop_params.py +13 -0
  378. qca/managed/types/environment_work_update_params.py +13 -0
  379. qca/managed/types/file_delete_params.py +12 -0
  380. qca/managed/types/file_document_source_param.py +12 -0
  381. qca/managed/types/file_download_params.py +12 -0
  382. qca/managed/types/file_get_metadata_params.py +12 -0
  383. qca/managed/types/file_image_source_param.py +12 -0
  384. qca/managed/types/file_list_params.py +19 -0
  385. qca/managed/types/file_metadata.py +25 -0
  386. qca/managed/types/file_resource.py +17 -0
  387. qca/managed/types/file_resource_params.py +13 -0
  388. qca/managed/types/file_rubric_params.py +12 -0
  389. qca/managed/types/file_scope.py +12 -0
  390. qca/managed/types/file_upload_params.py +18 -0
  391. qca/managed/types/git_hub_repository_resource_checkout_union.py +13 -0
  392. qca/managed/types/git_hub_repository_resource_config_checkout_union.py +13 -0
  393. qca/managed/types/git_hub_repository_resource_params.py +19 -0
  394. qca/managed/types/glob_tool_config_params.py +18 -0
  395. qca/managed/types/grep_tool_config_params.py +18 -0
  396. qca/managed/types/image_block_param.py +17 -0
  397. qca/managed/types/injection_location_params.py +12 -0
  398. qca/managed/types/injection_location_response.py +12 -0
  399. qca/managed/types/injection_location_update_params.py +12 -0
  400. qca/managed/types/limited_credential_networking_params.py +12 -0
  401. qca/managed/types/limited_network_params.py +14 -0
  402. qca/managed/types/mcp_probe.py +15 -0
  403. qca/managed/types/mcp_server_url_definition.py +13 -0
  404. qca/managed/types/mcp_tool_config.py +16 -0
  405. qca/managed/types/mcp_tool_config_params.py +17 -0
  406. qca/managed/types/mcp_tool_config_permission_policy_union.py +11 -0
  407. qca/managed/types/mcp_toolset_default_config_params.py +16 -0
  408. qca/managed/types/mcp_toolset_params.py +18 -0
  409. qca/managed/types/mcpo_auth_create_params.py +19 -0
  410. qca/managed/types/mcpo_auth_refresh_params.py +23 -0
  411. qca/managed/types/mcpo_auth_refresh_response.py +18 -0
  412. qca/managed/types/mcpo_auth_refresh_response_token_endpoint_auth_union.py +11 -0
  413. qca/managed/types/mcpo_auth_refresh_update_params.py +17 -0
  414. qca/managed/types/mcpo_auth_update_params.py +18 -0
  415. qca/managed/types/memory.py +22 -0
  416. qca/managed/types/memory_list_item_union.py +21 -0
  417. qca/managed/types/memory_store.py +19 -0
  418. qca/managed/types/memory_store_archive_params.py +12 -0
  419. qca/managed/types/memory_store_create_params.py +15 -0
  420. qca/managed/types/memory_store_delete_params.py +12 -0
  421. qca/managed/types/memory_store_list_params.py +19 -0
  422. qca/managed/types/memory_store_memory_create_params.py +16 -0
  423. qca/managed/types/memory_store_memory_delete_params.py +13 -0
  424. qca/managed/types/memory_store_memory_list_params.py +17 -0
  425. qca/managed/types/memory_store_memory_retrieve_params.py +13 -0
  426. qca/managed/types/memory_store_memory_update_params.py +21 -0
  427. qca/managed/types/memory_store_memory_version_list_params.py +23 -0
  428. qca/managed/types/memory_store_memory_version_redact_params.py +12 -0
  429. qca/managed/types/memory_store_memory_version_retrieve_params.py +13 -0
  430. qca/managed/types/memory_store_resource_param.py +14 -0
  431. qca/managed/types/memory_store_retrieve_params.py +12 -0
  432. qca/managed/types/memory_store_update_params.py +15 -0
  433. qca/managed/types/memory_version.py +27 -0
  434. qca/managed/types/model_capabilities.py +25 -0
  435. qca/managed/types/model_config.py +18 -0
  436. qca/managed/types/model_config_effort_union.py +11 -0
  437. qca/managed/types/model_config_params.py +39 -0
  438. qca/managed/types/model_info.py +30 -0
  439. qca/managed/types/model_list_params.py +15 -0
  440. qca/managed/types/monetary_amount.py +12 -0
  441. qca/managed/types/monetary_amount_param.py +12 -0
  442. qca/managed/types/multiagent.py +15 -0
  443. qca/managed/types/multiagent_agent_union.py +17 -0
  444. qca/managed/types/multiagent_params.py +17 -0
  445. qca/managed/types/multiagent_self_params.py +11 -0
  446. qca/managed/types/outcome_evaluation_resource.py +18 -0
  447. qca/managed/types/output_behavior_create_new_param.py +11 -0
  448. qca/managed/types/output_behavior_union.py +12 -0
  449. qca/managed/types/output_behavior_update_existing_param.py +12 -0
  450. qca/managed/types/packages.py +17 -0
  451. qca/managed/types/packages_params.py +17 -0
  452. qca/managed/types/plain_text_document_source_param.py +13 -0
  453. qca/managed/types/precondition_param.py +12 -0
  454. qca/managed/types/qoder_skill_params.py +13 -0
  455. qca/managed/types/read_tool_config_params.py +18 -0
  456. qca/managed/types/redacted_block_param.py +11 -0
  457. qca/managed/types/refresh_http_response.py +14 -0
  458. qca/managed/types/refresh_object.py +15 -0
  459. qca/managed/types/schedule.py +16 -0
  460. qca/managed/types/schedule_params.py +13 -0
  461. qca/managed/types/search_result_block_param.py +19 -0
  462. qca/managed/types/search_result_citations.py +11 -0
  463. qca/managed/types/search_result_citations_param.py +9 -0
  464. qca/managed/types/search_result_content.py +12 -0
  465. qca/managed/types/search_result_content_param.py +12 -0
  466. qca/managed/types/self_hosted_config_params.py +11 -0
  467. qca/managed/types/self_hosted_work.py +26 -0
  468. qca/managed/types/self_hosted_work_heartbeat_response.py +15 -0
  469. qca/managed/types/self_hosted_work_queue_stats.py +15 -0
  470. qca/managed/types/send_session_events.py +14 -0
  471. qca/managed/types/send_session_events_data_union.py +39 -0
  472. qca/managed/types/server_tool_usage.py +12 -0
  473. qca/managed/types/session.py +37 -0
  474. qca/managed/types/session_agent.py +28 -0
  475. qca/managed/types/session_agent_skill_union.py +13 -0
  476. qca/managed/types/session_agent_tool_union.py +25 -0
  477. qca/managed/types/session_agent_tool_union_default_config.py +17 -0
  478. qca/managed/types/session_agent_tool_union_default_config_permission_policy.py +11 -0
  479. qca/managed/types/session_agent_update_param.py +24 -0
  480. qca/managed/types/session_archive_params.py +12 -0
  481. qca/managed/types/session_create_params.py +31 -0
  482. qca/managed/types/session_delete_params.py +12 -0
  483. qca/managed/types/session_error_event_error_union.py +19 -0
  484. qca/managed/types/session_error_event_error_union_retry_status.py +11 -0
  485. qca/managed/types/session_event.py +77 -0
  486. qca/managed/types/session_event_list_params.py +23 -0
  487. qca/managed/types/session_event_send_params.py +34 -0
  488. qca/managed/types/session_event_stop_reason.py +12 -0
  489. qca/managed/types/session_event_stream_params.py +13 -0
  490. qca/managed/types/session_event_usage.py +24 -0
  491. qca/managed/types/session_list_params.py +26 -0
  492. qca/managed/types/session_multiagent_coordinator.py +15 -0
  493. qca/managed/types/session_multiagent_coordinator_agent_union.py +26 -0
  494. qca/managed/types/session_resource_add_params.py +15 -0
  495. qca/managed/types/session_resource_config_union.py +21 -0
  496. qca/managed/types/session_resource_delete_params.py +12 -0
  497. qca/managed/types/session_resource_get_response_union.py +27 -0
  498. qca/managed/types/session_resource_list_params.py +16 -0
  499. qca/managed/types/session_resource_retrieve_params.py +12 -0
  500. qca/managed/types/session_resource_union.py +27 -0
  501. qca/managed/types/session_resource_update_params.py +14 -0
  502. qca/managed/types/session_resource_update_response_union.py +27 -0
  503. qca/managed/types/session_retrieve_params.py +12 -0
  504. qca/managed/types/session_stats.py +12 -0
  505. qca/managed/types/session_stream_event.py +82 -0
  506. qca/managed/types/session_stream_event_stop_reason.py +12 -0
  507. qca/managed/types/session_stream_event_usage.py +24 -0
  508. qca/managed/types/session_thread.py +27 -0
  509. qca/managed/types/session_thread_agent_skill_union.py +13 -0
  510. qca/managed/types/session_thread_agent_tool_union.py +25 -0
  511. qca/managed/types/session_thread_agent_tool_union_default_config.py +17 -0
  512. qca/managed/types/session_thread_agent_tool_union_default_config_permission_policy.py +11 -0
  513. qca/managed/types/session_thread_agent_union.py +26 -0
  514. qca/managed/types/session_thread_archive_params.py +12 -0
  515. qca/managed/types/session_thread_event_list_params.py +16 -0
  516. qca/managed/types/session_thread_event_stream_params.py +13 -0
  517. qca/managed/types/session_thread_list_params.py +14 -0
  518. qca/managed/types/session_thread_retrieve_params.py +12 -0
  519. qca/managed/types/session_thread_stats.py +13 -0
  520. qca/managed/types/session_thread_usage.py +22 -0
  521. qca/managed/types/session_update_params.py +22 -0
  522. qca/managed/types/session_usage.py +22 -0
  523. qca/managed/types/session_work_data.py +12 -0
  524. qca/managed/types/skill.py +22 -0
  525. qca/managed/types/skill_create_params.py +17 -0
  526. qca/managed/types/skill_delete_params.py +12 -0
  527. qca/managed/types/skill_list_params.py +19 -0
  528. qca/managed/types/skill_retrieve_params.py +12 -0
  529. qca/managed/types/skill_source.py +11 -0
  530. qca/managed/types/skill_version.py +19 -0
  531. qca/managed/types/skill_version_create_params.py +15 -0
  532. qca/managed/types/skill_version_delete_params.py +12 -0
  533. qca/managed/types/skill_version_download_params.py +12 -0
  534. qca/managed/types/skill_version_list_params.py +14 -0
  535. qca/managed/types/skill_version_retrieve_params.py +12 -0
  536. qca/managed/types/span_model_usage.py +15 -0
  537. qca/managed/types/start_event_preview_union.py +12 -0
  538. qca/managed/types/static_bearer_create_params.py +13 -0
  539. qca/managed/types/static_bearer_update_params.py +12 -0
  540. qca/managed/types/stream_session_thread_events_union.py +82 -0
  541. qca/managed/types/stream_session_thread_events_union_stop_reason.py +12 -0
  542. qca/managed/types/stream_session_thread_events_union_usage.py +24 -0
  543. qca/managed/types/system_content_block.py +12 -0
  544. qca/managed/types/system_content_block_param.py +12 -0
  545. qca/managed/types/system_message_event_params.py +15 -0
  546. qca/managed/types/text_block.py +12 -0
  547. qca/managed/types/text_block_param.py +12 -0
  548. qca/managed/types/text_rubric_params.py +12 -0
  549. qca/managed/types/thinking_capability.py +15 -0
  550. qca/managed/types/thinking_types.py +15 -0
  551. qca/managed/types/token_endpoint_auth_basic_param.py +12 -0
  552. qca/managed/types/token_endpoint_auth_basic_update_param.py +12 -0
  553. qca/managed/types/token_endpoint_auth_none_param.py +11 -0
  554. qca/managed/types/token_endpoint_auth_post_param.py +12 -0
  555. qca/managed/types/token_endpoint_auth_post_update_param.py +12 -0
  556. qca/managed/types/trigger_context_union.py +13 -0
  557. qca/managed/types/unrestricted_credential_networking_params.py +11 -0
  558. qca/managed/types/unrestricted_network_param.py +11 -0
  559. qca/managed/types/url_document_source_param.py +12 -0
  560. qca/managed/types/url_image_source_param.py +12 -0
  561. qca/managed/types/urlmcp_server_params.py +13 -0
  562. qca/managed/types/user_custom_tool_result_event_content_union.py +21 -0
  563. qca/managed/types/user_custom_tool_result_event_params.py +20 -0
  564. qca/managed/types/user_define_outcome_event_params.py +18 -0
  565. qca/managed/types/user_define_outcome_event_rubric_union.py +13 -0
  566. qca/managed/types/user_interrupt_event_params.py +12 -0
  567. qca/managed/types/user_location.py +15 -0
  568. qca/managed/types/user_location_param.py +15 -0
  569. qca/managed/types/user_message_event_content_union.py +18 -0
  570. qca/managed/types/user_message_event_content_union_source.py +15 -0
  571. qca/managed/types/user_message_event_params.py +18 -0
  572. qca/managed/types/user_tool_confirmation_event_params.py +14 -0
  573. qca/managed/types/user_tool_result_event_content_union.py +21 -0
  574. qca/managed/types/user_tool_result_event_params.py +20 -0
  575. qca/managed/types/vault.py +18 -0
  576. qca/managed/types/vault_archive_params.py +12 -0
  577. qca/managed/types/vault_create_params.py +14 -0
  578. qca/managed/types/vault_credential_archive_params.py +12 -0
  579. qca/managed/types/vault_credential_create_params.py +20 -0
  580. qca/managed/types/vault_credential_delete_params.py +12 -0
  581. qca/managed/types/vault_credential_list_params.py +18 -0
  582. qca/managed/types/vault_credential_mcpo_auth_validate_params.py +12 -0
  583. qca/managed/types/vault_credential_retrieve_params.py +12 -0
  584. qca/managed/types/vault_credential_update_params.py +19 -0
  585. qca/managed/types/vault_delete_params.py +12 -0
  586. qca/managed/types/vault_list_params.py +18 -0
  587. qca/managed/types/vault_retrieve_params.py +12 -0
  588. qca/managed/types/web_fetch_tool_config_params.py +21 -0
  589. qca/managed/types/web_search_tool_config_params.py +22 -0
  590. qca/managed/types/write_tool_config_params.py +18 -0
  591. qca/py.typed +0 -0
  592. qca-0.0.1.dev1.dist-info/METADATA +279 -0
  593. qca-0.0.1.dev1.dist-info/RECORD +596 -0
  594. qca-0.0.1.dev1.dist-info/WHEEL +5 -0
  595. qca-0.0.1.dev1.dist-info/licenses/LICENSE +21 -0
  596. 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
@@ -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)
@@ -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()
@@ -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: ...
@@ -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
@@ -0,0 +1,7 @@
1
+ from ._client import AsyncForward as AsyncForward
2
+ from ._client import Forward as Forward
3
+
4
+ Client = Forward
5
+ AsyncClient = AsyncForward
6
+ ForwardClient = Forward
7
+ AsyncForwardClient = AsyncForward