From 7c7266176bf8bc38d50d68c9afe85a61520e9079 Mon Sep 17 00:00:00 2001 From: junkai-roe-ai <193960677+junkai-roe-ai@users.noreply.github.com> Date: Mon, 26 Oct 2026 06:18:28 +0000 Subject: [PATCH 1/2] Release v1.1.20 --- .roe-main-release-version | 2 +- README.md | 2 +- SDK_EXAMPLES.md | 206 ++ openapi/openapi.yml | 1927 ++++++++++++++++- openapi/wrappers.yml | 311 +++ pyproject.toml | 2 +- src/roe/_generated/api/workflows/__init__.py | 1 + .../api/workflows/workflows_create.py | 242 +++ .../api/workflows/workflows_destroy.py | 209 ++ .../api/workflows/workflows_list.py | 255 +++ .../api/workflows/workflows_partial_update.py | 261 +++ .../api/workflows/workflows_retrieve.py | 213 ++ .../workflows/workflows_runs_batch_create.py | 274 +++ .../api/workflows/workflows_runs_create.py | 280 +++ .../api/workflows/workflows_runs_list.py | 250 +++ .../api/workflows/workflows_runs_retrieve.py | 213 ++ .../workflows/workflows_versions_create.py | 263 +++ .../api/workflows/workflows_versions_list.py | 235 ++ .../workflows/workflows_versions_retrieve.py | 230 ++ .../workflows_versions_set_current_create.py | 226 ++ src/roe/_generated/models/__init__.py | 108 + src/roe/_generated/models/agent_step.py | 110 + .../models/agent_step_input_mapping.py | 65 + src/roe/_generated/models/approval_block.py | 232 ++ src/roe/_generated/models/combine_enum.py | 8 + src/roe/_generated/models/condition.py | 89 + src/roe/_generated/models/connection_step.py | 133 ++ .../models/connection_step_input_mapping.py | 65 + src/roe/_generated/models/edit_fields_step.py | 85 + .../models/edit_fields_step_fields.py | 65 + src/roe/_generated/models/for_each_block.py | 235 ++ src/roe/_generated/models/gate_kind.py | 8 + src/roe/_generated/models/if_block.py | 380 ++++ src/roe/_generated/models/input_field.py | 114 + src/roe/_generated/models/merge_step.py | 105 + src/roe/_generated/models/mode_enum.py | 8 + src/roe/_generated/models/operator_enum.py | 15 + .../models/paginated_workflow_list.py | 145 ++ .../models/paginated_workflow_run_list.py | 145 ++ .../models/paginated_workflow_version_list.py | 145 ++ src/roe/_generated/models/parallel_block.py | 218 ++ .../models/patched_workflow_update_request.py | 78 + src/roe/_generated/models/step_run.py | 309 +++ .../models/step_run_delivery_enum.py | 9 + .../_generated/models/step_run_status_enum.py | 10 + src/roe/_generated/models/workflow.py | 194 ++ .../models/workflow_create_request.py | 111 + .../_generated/models/workflow_definition.py | 242 +++ .../models/workflow_definition_request.py | 242 +++ src/roe/_generated/models/workflow_detail.py | 225 ++ src/roe/_generated/models/workflow_run.py | 164 ++ .../_generated/models/workflow_run_batch.py | 94 + .../workflow_run_batch_create_request.py | 115 + ...ow_run_batch_create_request_inputs_item.py | 65 + .../models/workflow_run_create_request.py | 145 ++ .../workflow_run_create_request_inputs.py | 67 + .../workflow_run_create_request_metadata.py | 65 + .../_generated/models/workflow_run_detail.py | 225 ++ .../models/workflow_run_status_enum.py | 11 + src/roe/_generated/models/workflow_version.py | 181 ++ .../models/workflow_version_create_request.py | 103 + .../models/workflow_version_detail.py | 233 ++ .../workflows_create_response_400_type_0.py | 93 + .../workflows_create_response_400_type_1.py | 103 + ..._create_response_400_type_1_errors_item.py | 92 + ...lows_partial_update_response_400_type_0.py | 93 + ...lows_partial_update_response_400_type_1.py | 103 + ..._update_response_400_type_1_errors_item.py | 92 + ...s_runs_batch_create_response_400_type_1.py | 93 + ...s_runs_batch_create_response_400_type_2.py | 77 + ...rkflows_runs_create_response_400_type_1.py | 93 + ...rkflows_runs_create_response_400_type_2.py | 77 + ...ows_versions_create_response_400_type_0.py | 93 + ...ows_versions_create_response_400_type_1.py | 103 + ..._create_response_400_type_1_errors_item.py | 92 + src/roe/api/_generated_registry.py | 2 + src/roe/api/workflows.py | 286 +++ uv.lock | 2 +- 78 files changed, 12351 insertions(+), 111 deletions(-) create mode 100644 src/roe/_generated/api/workflows/__init__.py create mode 100644 src/roe/_generated/api/workflows/workflows_create.py create mode 100644 src/roe/_generated/api/workflows/workflows_destroy.py create mode 100644 src/roe/_generated/api/workflows/workflows_list.py create mode 100644 src/roe/_generated/api/workflows/workflows_partial_update.py create mode 100644 src/roe/_generated/api/workflows/workflows_retrieve.py create mode 100644 src/roe/_generated/api/workflows/workflows_runs_batch_create.py create mode 100644 src/roe/_generated/api/workflows/workflows_runs_create.py create mode 100644 src/roe/_generated/api/workflows/workflows_runs_list.py create mode 100644 src/roe/_generated/api/workflows/workflows_runs_retrieve.py create mode 100644 src/roe/_generated/api/workflows/workflows_versions_create.py create mode 100644 src/roe/_generated/api/workflows/workflows_versions_list.py create mode 100644 src/roe/_generated/api/workflows/workflows_versions_retrieve.py create mode 100644 src/roe/_generated/api/workflows/workflows_versions_set_current_create.py create mode 100644 src/roe/_generated/models/agent_step.py create mode 100644 src/roe/_generated/models/agent_step_input_mapping.py create mode 100644 src/roe/_generated/models/approval_block.py create mode 100644 src/roe/_generated/models/combine_enum.py create mode 100644 src/roe/_generated/models/condition.py create mode 100644 src/roe/_generated/models/connection_step.py create mode 100644 src/roe/_generated/models/connection_step_input_mapping.py create mode 100644 src/roe/_generated/models/edit_fields_step.py create mode 100644 src/roe/_generated/models/edit_fields_step_fields.py create mode 100644 src/roe/_generated/models/for_each_block.py create mode 100644 src/roe/_generated/models/gate_kind.py create mode 100644 src/roe/_generated/models/if_block.py create mode 100644 src/roe/_generated/models/input_field.py create mode 100644 src/roe/_generated/models/merge_step.py create mode 100644 src/roe/_generated/models/mode_enum.py create mode 100644 src/roe/_generated/models/operator_enum.py create mode 100644 src/roe/_generated/models/paginated_workflow_list.py create mode 100644 src/roe/_generated/models/paginated_workflow_run_list.py create mode 100644 src/roe/_generated/models/paginated_workflow_version_list.py create mode 100644 src/roe/_generated/models/parallel_block.py create mode 100644 src/roe/_generated/models/patched_workflow_update_request.py create mode 100644 src/roe/_generated/models/step_run.py create mode 100644 src/roe/_generated/models/step_run_delivery_enum.py create mode 100644 src/roe/_generated/models/step_run_status_enum.py create mode 100644 src/roe/_generated/models/workflow.py create mode 100644 src/roe/_generated/models/workflow_create_request.py create mode 100644 src/roe/_generated/models/workflow_definition.py create mode 100644 src/roe/_generated/models/workflow_definition_request.py create mode 100644 src/roe/_generated/models/workflow_detail.py create mode 100644 src/roe/_generated/models/workflow_run.py create mode 100644 src/roe/_generated/models/workflow_run_batch.py create mode 100644 src/roe/_generated/models/workflow_run_batch_create_request.py create mode 100644 src/roe/_generated/models/workflow_run_batch_create_request_inputs_item.py create mode 100644 src/roe/_generated/models/workflow_run_create_request.py create mode 100644 src/roe/_generated/models/workflow_run_create_request_inputs.py create mode 100644 src/roe/_generated/models/workflow_run_create_request_metadata.py create mode 100644 src/roe/_generated/models/workflow_run_detail.py create mode 100644 src/roe/_generated/models/workflow_run_status_enum.py create mode 100644 src/roe/_generated/models/workflow_version.py create mode 100644 src/roe/_generated/models/workflow_version_create_request.py create mode 100644 src/roe/_generated/models/workflow_version_detail.py create mode 100644 src/roe/_generated/models/workflows_create_response_400_type_0.py create mode 100644 src/roe/_generated/models/workflows_create_response_400_type_1.py create mode 100644 src/roe/_generated/models/workflows_create_response_400_type_1_errors_item.py create mode 100644 src/roe/_generated/models/workflows_partial_update_response_400_type_0.py create mode 100644 src/roe/_generated/models/workflows_partial_update_response_400_type_1.py create mode 100644 src/roe/_generated/models/workflows_partial_update_response_400_type_1_errors_item.py create mode 100644 src/roe/_generated/models/workflows_runs_batch_create_response_400_type_1.py create mode 100644 src/roe/_generated/models/workflows_runs_batch_create_response_400_type_2.py create mode 100644 src/roe/_generated/models/workflows_runs_create_response_400_type_1.py create mode 100644 src/roe/_generated/models/workflows_runs_create_response_400_type_2.py create mode 100644 src/roe/_generated/models/workflows_versions_create_response_400_type_0.py create mode 100644 src/roe/_generated/models/workflows_versions_create_response_400_type_1.py create mode 100644 src/roe/_generated/models/workflows_versions_create_response_400_type_1_errors_item.py create mode 100644 src/roe/api/workflows.py diff --git a/.roe-main-release-version b/.roe-main-release-version index 68a4606..cb06f0f 100644 --- a/.roe-main-release-version +++ b/.roe-main-release-version @@ -1 +1 @@ -1-1-2 +1-1-3 diff --git a/README.md b/README.md index 1754083..0af3b44 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A Python SDK for the [Roe](https://www.roe-ai.com/) API. -> **v1.1.19** - SDK operation coverage is synchronized across Python, +> **v1.1.20** - SDK operation coverage is synchronized across Python, > TypeScript, and Go. See `SDK_EXAMPLES.md` for copy-ready examples and > use cases. diff --git a/SDK_EXAMPLES.md b/SDK_EXAMPLES.md index 25545ca..d159147 100644 --- a/SDK_EXAMPLES.md +++ b/SDK_EXAMPLES.md @@ -1127,6 +1127,212 @@ client = RoeClient() result = client.users.me() ``` +### Workflows + +#### `workflows_list` + +List workflows + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.list( + page=1, # optional + page_size=1, # optional + search="search", # optional +) +``` + +#### `workflows_create` + +Create a workflow + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.create( + name="name", # required + definition={"inputs": [{"key": "customer_id"}], "steps": [{"kind": "agent", "id": "check_risk", "base_agent_id": "agent_id", "agent_version_id": "version_id", "input_mapping": {"customer": "{initial.customer_id}"}}], "result": "check_risk"}, # required + version_name="version_name", # optional + description="description", # optional +) +``` + +#### `workflows_retrieve` + +Get a workflow + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.retrieve( + workflow_id="workflow_id", # required +) +``` + +#### `workflows_partial_update` + +Rename a workflow + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.update( + workflow_id="workflow_id", # required + name="name", # required +) +``` + +#### `workflows_destroy` + +Delete a workflow + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.delete( + workflow_id="workflow_id", # required +) +``` + +#### `workflows_versions_list` + +List workflow versions + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.list_versions( + workflow_id="workflow_id", # required + page=1, # optional + page_size=1, # optional +) +``` + +#### `workflows_versions_create` + +Save a workflow version + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.create_version( + workflow_id="workflow_id", # required + definition={"inputs": [{"key": "customer_id"}], "steps": [{"kind": "agent", "id": "check_risk", "base_agent_id": "agent_id", "agent_version_id": "version_id", "input_mapping": {"customer": "{initial.customer_id}"}}], "result": "check_risk"}, # required + version_name="version_name", # optional + description="description", # optional +) +``` + +#### `workflows_versions_retrieve` + +Get a workflow version + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.retrieve_version( + workflow_id="workflow_id", # required + version_id="version_id", # required +) +``` + +#### `workflows_versions_set_current_create` + +Set the current workflow version + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.set_current_version( + workflow_id="workflow_id", # required + version_id="version_id", # required +) +``` + +#### `workflows_runs_list` + +List workflow runs + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.list_runs( + workflow_id="workflow_id", # required + page=1, # optional + page_size=1, # optional + limit=1, # optional +) +``` + +#### `workflows_runs_create` + +Run a workflow + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.run( + workflow_id="workflow_id", # required + inputs={"customer_id": "c_1"}, # optional + version_id="version_id", # optional + metadata={}, # optional + wait=True, # optional +) +``` + +#### `workflows_runs_batch_create` + +Run a workflow in batch + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.run_batch( + workflow_id="workflow_id", # required + inputs=[{"customer_id": "c_1"}], # required + version_id="version_id", # optional +) +``` + +#### `workflows_runs_retrieve` + +Get a workflow run + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.workflows.retrieve_run( + run_id="run_id", # required +) +``` + ## Use Cases These workflows assume `ROE_API_KEY` and `ROE_ORGANIZATION_ID` are set. diff --git a/openapi/openapi.yml b/openapi/openapi.yml index f3db5a7..ac615f8 100644 --- a/openapi/openapi.yml +++ b/openapi/openapi.yml @@ -4171,6 +4171,753 @@ paths: schema: $ref: '#/components/schemas/User' description: '' + /v1/workflows/: + get: + operationId: workflows_list + description: List the organization's workflows, most recently updated first. + summary: List workflows + parameters: + - in: query + name: agent_id + schema: + type: string + format: uuid + description: Only the workflow with this agent id. + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedWorkflowList' + description: '' + post: + operationId: workflows_create + description: Create a workflow from a block-format definition; its first version + becomes current. A definition that fails its checks returns each error with + the step it belongs to. + summary: Create a workflow + tags: + - workflows + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowCreateRequest' + required: true + security: + - apiKeyAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowDetail' + description: '' + '400': + content: + application/json: + schema: + oneOf: + - type: object + additionalProperties: + oneOf: + - type: array + items: + type: string + - type: string + description: 'Validation failure: a map of field name to a list + of error messages (DRF serializers) or a single message (e.g. + organization_id validation).' + - type: object + properties: + detail: + type: string + errors: + type: array + items: + type: object + properties: + step_id: + type: + - string + - 'null' + message: + type: string + required: + - step_id + - message + required: + - detail + - errors + description: The definition failed its save checks; each error names + its step. + description: Invalid request, or a definition that fails its save checks. + parameters: + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + /v1/workflows/{workflow_id}/: + get: + operationId: workflows_retrieve + description: Get a workflow with its current version. + summary: Get a workflow + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowDetail' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + patch: + operationId: workflows_partial_update + description: Rename a workflow. Its versions are unchanged. + summary: Rename a workflow + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedWorkflowUpdateRequest' + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowDetail' + description: '' + '400': + content: + application/json: + schema: + oneOf: + - type: object + additionalProperties: + oneOf: + - type: array + items: + type: string + - type: string + description: 'Validation failure: a map of field name to a list + of error messages (DRF serializers) or a single message (e.g. + organization_id validation).' + - type: object + properties: + detail: + type: string + errors: + type: array + items: + type: object + properties: + step_id: + type: + - string + - 'null' + message: + type: string + required: + - step_id + - message + required: + - detail + - errors + description: The definition failed its save checks; each error names + its step. + description: Invalid request, or a definition that fails its save checks. + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + delete: + operationId: workflows_destroy + description: Delete a workflow and all its versions. + summary: Delete a workflow + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '204': + description: Deleted. + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/{workflow_id}/runs/: + get: + operationId: workflows_runs_list + description: List a workflow's runs, newest first. + summary: List workflow runs + parameters: + - name: limit + required: false + in: query + description: Maximum number of most-recent jobs to consider and count. Caps + the reported total so pagination stays fast for agents with large job histories. + Defaults to 100000; pass 0 for no cap (full count, slower). + schema: + type: integer + default: 100000 + minimum: 0 + maximum: 1000000 + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedWorkflowRunList' + description: '' + post: + operationId: workflows_runs_create + description: Start a run of the current version, or of version_id. With wait, + the response comes when the run finishes or after 60 seconds, whichever is + first. + summary: Run a workflow + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowRunCreateRequest' + security: + - apiKeyAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowRunDetail' + description: '' + '400': + content: + application/json: + schema: + oneOf: + - type: array + items: + type: string + description: 'DRF ValidationError raised with a message string: + the body is a bare JSON array of error messages.' + - type: object + additionalProperties: + oneOf: + - type: array + items: + type: string + - type: string + description: 'Validation failure: a map of field name to a list + of error messages (DRF serializers) or a single message (e.g. + organization_id validation).' + - type: object + properties: + error: + type: string + required: + - error + description: Hand-built application error body. + description: Bad request. The body is a bare array of messages, a + field-error map, or an {error} object depending on which validation + failed. + description: '' + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/{workflow_id}/runs/batch/: + post: + operationId: workflows_runs_batch_create + description: Start one run per item of inputs. + summary: Run a workflow in batch + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowRunBatchCreateRequest' + required: true + security: + - apiKeyAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowRunBatch' + description: '' + '400': + content: + application/json: + schema: + oneOf: + - type: array + items: + type: string + description: 'DRF ValidationError raised with a message string: + the body is a bare JSON array of error messages.' + - type: object + additionalProperties: + oneOf: + - type: array + items: + type: string + - type: string + description: 'Validation failure: a map of field name to a list + of error messages (DRF serializers) or a single message (e.g. + organization_id validation).' + - type: object + properties: + error: + type: string + required: + - error + description: Hand-built application error body. + description: Bad request. The body is a bare array of messages, a + field-error map, or an {error} object depending on which validation + failed. + description: '' + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/{workflow_id}/versions/: + get: + operationId: workflows_versions_list + description: List a workflow's versions, newest first. + summary: List workflow versions + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedWorkflowVersionList' + description: '' + post: + operationId: workflows_versions_create + description: Save a new version from a complete block-format definition and + make it current. Agent versions stay pinned as given, and the current version's + post actions carry over. + summary: Save a workflow version + parameters: + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowVersionCreateRequest' + required: true + security: + - apiKeyAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowVersionDetail' + description: '' + '400': + content: + application/json: + schema: + oneOf: + - type: object + additionalProperties: + oneOf: + - type: array + items: + type: string + - type: string + description: 'Validation failure: a map of field name to a list + of error messages (DRF serializers) or a single message (e.g. + organization_id validation).' + - type: object + properties: + detail: + type: string + errors: + type: array + items: + type: object + properties: + step_id: + type: + - string + - 'null' + message: + type: string + required: + - step_id + - message + required: + - detail + - errors + description: The definition failed its save checks; each error names + its step. + description: Invalid request, or a definition that fails its save checks. + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/{workflow_id}/versions/{version_id}/: + get: + operationId: workflows_versions_retrieve + description: 'Get one version with its definition. A version saved in the old + format is read-only: its definition is null and conversion_reasons says why.' + summary: Get a workflow version + parameters: + - in: path + name: version_id + schema: + type: string + format: uuid + required: true + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowVersionDetail' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/{workflow_id}/versions/{version_id}/set-current/: + post: + operationId: workflows_versions_set_current_create + description: Make a version the one that runs by default. + summary: Set the current workflow version + parameters: + - in: path + name: version_id + schema: + type: string + format: uuid + required: true + - in: path + name: workflow_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowVersionDetail' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/workflows/runs/{run_id}/: + get: + operationId: workflows_runs_retrieve + description: Get a run with its outputs once it has finished, and what each + step received and returned. + summary: Get a workflow run + parameters: + - in: path + name: run_id + schema: + type: string + format: uuid + required: true + - name: organization_id + in: query + required: false + schema: + type: string + format: uuid + description: Organization ID. This is required for access control. It can + be provided via query or request body depending on the endpoint. + tags: + - workflows + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowRunDetail' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' components: schemas: AgentDatum: @@ -4599,7 +5346,32 @@ components: $ref: '#/components/schemas/AgentExecutionRequest' description: List of agent execution requests to process required: - - inputs + - inputs + AgentStep: + additionalProperties: false + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: agent + default: agent + type: string + base_agent_id: + type: string + agent_version_id: + type: string + input_mapping: + additionalProperties: + type: string + type: object + required: + - kind + - id + - base_agent_id + - agent_version_id + type: object AgentTag: type: object description: Serializer for AgentTag model @@ -4769,6 +5541,50 @@ components: description: Application error message required: - error + ApprovalBlock: + additionalProperties: false + description: Steps that run once someone approves the agent step just before. + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: approval + default: approval + type: string + approval: + $ref: '#/components/schemas/GateKind' + default: manual + steps: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + minItems: 1 + type: array + required: + - kind + - id + - steps + type: object BaseAgent: type: object description: Serializer for BaseAgent (agent config) @@ -4924,6 +5740,25 @@ components: * `yellow` - Yellow * `gray` - Gray * `pink` - Pink + CombineEnum: + enum: + - all + - any + type: string + Condition: + additionalProperties: false + properties: + field: + type: string + operator: + allOf: + - $ref: '#/components/schemas/OperatorEnum' + default: equals + value: + default: null + required: + - field + type: object Connection: type: object description: |- @@ -5109,6 +5944,39 @@ components: - organization - updated_at - user + ConnectionStep: + additionalProperties: false + description: |- + Calls one operation of a saved connection, such as an API lookup or a + Slack message. Credentials stay with the connection. + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: connection + default: connection + type: string + connection_id: + type: string + setup_id: + anyOf: + - type: string + - type: 'null' + default: null + operation: + type: string + input_mapping: + additionalProperties: + type: string + type: object + required: + - kind + - id + - connection_id + - operation + type: object ConnectorBrowserSession: type: object properties: @@ -5539,6 +6407,26 @@ components: required: - error - existing_connection + EditFieldsStep: + additionalProperties: false + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: edit_fields + default: edit_fields + type: string + fields: + additionalProperties: + type: string + type: object + required: + - kind + - id + - fields + type: object ErrorDetailResponse: type: object description: 'DRF default error body: NotFound, PermissionDenied, Http404, etc.' @@ -5548,6 +6436,65 @@ components: description: Human-readable error detail required: - detail + ForEachBlock: + additionalProperties: false + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: for_each + default: for_each + type: string + items: + type: string + item_name: + default: item + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + parallel: + default: true + type: boolean + steps: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + minItems: 1 + type: array + required: + - kind + - id + - items + - steps + type: object + GateKind: + description: |- + What opens a gate: an org admin's explicit approval (manual) or the + reviewer's verdict decision on the source agent's result (feedback). + enum: + - manual + - feedback + type: string GenerateSkillSetVersionRequest: type: object description: |- @@ -5620,6 +6567,97 @@ components: - run_id - sse_endpoint - workflow_id + IfBlock: + additionalProperties: false + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: if + default: if + type: string + conditions: + items: + $ref: '#/components/schemas/Condition' + minItems: 1 + type: array + combine: + allOf: + - $ref: '#/components/schemas/CombineEnum' + default: all + then: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + type: array + otherwise: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + type: array + required: + - kind + - id + - conditions + type: object + InputField: + description: One input a step needs or a workflow declares. + properties: + key: + type: string + data_type: + default: text/plain + type: string + description: + default: '' + type: string + required: + default: true + type: boolean + accepts_multiple_files: + default: false + type: boolean + required: + - key + type: object JobInput: type: object description: Serializer for individual job input data @@ -5727,6 +6765,34 @@ components: - status_code - status_events - ui_fields + MergeStep: + additionalProperties: false + description: |- + One value from several steps' outputs, leaving out any that didn't run, + such as the side of an If that wasn't taken. + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: merge + default: merge + type: string + mode: + allOf: + - $ref: '#/components/schemas/ModeEnum' + default: append + sources: + items: + type: string + minItems: 1 + type: array + required: + - kind + - id + - sources + type: object MessageResponse: type: object description: 'Simple success acknowledgement body: `{"message": ...}`.' @@ -5735,6 +6801,23 @@ components: type: string required: - message + ModeEnum: + enum: + - append + - combine + type: string + OperatorEnum: + enum: + - equals + - not_equals + - contains + - greater_than + - less_than + - is_empty + - is_not_empty + - is_true + - is_false + type: string PaginatedBaseAgentList: type: object required: @@ -5896,6 +6979,118 @@ components: type: array items: $ref: '#/components/schemas/SkillSetVersion' + PaginatedWorkflowList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Workflow' + PaginatedWorkflowRunList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/WorkflowRun' + PaginatedWorkflowVersionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/WorkflowVersion' + ParallelBlock: + additionalProperties: false + properties: + id: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + kind: + const: parallel + default: parallel + type: string + lanes: + items: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + minItems: 1 + type: array + minItems: 2 + type: array + required: + - kind + - id + - lanes + type: object PatchedAgentVersionUpdateRequest: type: object properties: @@ -5979,6 +7174,13 @@ components: - string - 'null' format: uuid + PatchedWorkflowUpdateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 200 Policy: type: object description: Policy serializer @@ -6458,12 +7660,88 @@ components: - id StatusEnum: enum: - - active - - error + - active + - error + type: string + description: |- + * `active` - Active + * `error` - Error + StepRun: + type: object + properties: + step_id: + type: string + maxLength: 200 + execution_path: {} + status: + $ref: '#/components/schemas/StepRunStatusEnum' + cached: + type: boolean + input: + oneOf: + - {} + - type: 'null' + output: + oneOf: + - {} + - type: 'null' + error: + type: + - string + - 'null' + child_job_id: + type: + - string + - 'null' + format: uuid + readOnly: true + delivery: + description: |- + For a step that sends: sending, sent, or unknown when Roe couldn't tell whether the send went through. + + * `sending` - Sending + * `sent` - Sent + * `unknown` - Unknown + oneOf: + - $ref: '#/components/schemas/StepRunDeliveryEnum' + - type: 'null' + started_at: + type: + - string + - 'null' + format: date-time + finished_at: + type: + - string + - 'null' + format: date-time + required: + - child_job_id + - execution_path + - status + - step_id + StepRunDeliveryEnum: + enum: + - sending + - sent + - unknown type: string description: |- - * `active` - Active - * `error` - Error + * `sending` - Sending + * `sent` - Sent + * `unknown` - Unknown + StepRunStatusEnum: + enum: + - succeeded + - failed + - skipped + - cancelled + type: string + description: |- + * `succeeded` - succeeded + * `failed` - failed + * `skipped` - skipped + * `cancelled` - cancelled SupportedLLMModel: type: object description: Serializer for tenant-agnostic supported LLM metadata. @@ -6814,26 +8092,333 @@ components: and (c) leak Pydantic field/value details through DRF's generic 400 handler. The serializer only does shape checks. properties: - name: - type: string - minLength: 1 - maxLength: 250 - description: + name: + type: string + minLength: 1 + maxLength: 250 + description: + type: string + config: + type: object + additionalProperties: {} + auth_config: + type: object + additionalProperties: {} + dynamic_inputs: + type: object + additionalProperties: + type: string + minLength: 1 + UpdatePolicy: + type: object + description: Serializer for updating policy metadata (name, description) + properties: + id: + type: string + format: uuid + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + organization_id: + type: string + format: uuid + readOnly: true + current_version_id: + type: + - string + - 'null' + format: uuid + readOnly: true + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + required: + - created_at + - current_version_id + - id + - name + - organization_id + - updated_at + UpdatePolicyRequest: + type: object + description: Serializer for updating policy metadata (name, description) + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + required: + - name + UpdateSkillSet: + type: object + description: Update skill set metadata (name, description, key) only. + properties: + id: + type: string + format: uuid + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + organization_id: + type: string + format: uuid + readOnly: true + knowledge_base_key_id: + type: + - string + - 'null' + format: uuid + current_version_id: + type: + - string + - 'null' + format: uuid + readOnly: true + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + required: + - created_at + - current_version_id + - id + - name + - organization_id + - updated_at + User: + type: object + properties: + id: + type: integer + readOnly: true + email: + type: string + format: email + first_name: + type: string + last_name: + type: string + display_name: + type: string + readOnly: true + is_staff: + type: boolean + default: false + is_superuser: + type: boolean + default: false + is_active: + type: boolean + default: true + date_joined: + type: string + format: date-time + readOnly: true + is_first_login: + type: boolean + default: true + is_email_verified: + type: boolean + default: false + is_mfa_enabled: + type: boolean + default: true + required: + - date_joined + - display_name + - email + - first_name + - id + - last_name + UserInfo: + type: object + properties: + id: + type: integer + readOnly: true + email: + type: string + format: email + title: Email address + maxLength: 254 + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + display_name: + type: string + readOnly: true + required: + - display_name + - email + - id + Workflow: + type: object + properties: + id: + type: string + format: uuid + readOnly: true + name: + type: string + maxLength: 200 + agent_id: + type: string + format: uuid + readOnly: true + description: The workflow's id as an agent. Calling a workflow by it is + deprecated; the agent_id filter finds the workflow it belongs to. + current_version_id: + type: + - string + - 'null' + format: uuid + readOnly: true + creator: + oneOf: + - $ref: '#/components/schemas/UserInfo' + - type: 'null' + readOnly: true + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + readOnly: true + required: + - agent_id + - creator + - current_version_id + - id + - name + - updated_at + WorkflowCreateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 200 + definition: + $ref: '#/components/schemas/WorkflowDefinitionRequest' + version_name: + type: string + minLength: 1 + maxLength: 200 + description: + type: string + maxLength: 1024 + required: + - definition + - name + WorkflowDefinition: + additionalProperties: false + properties: + format_version: + const: 2 + default: 2 + type: integer + inputs: + items: + $ref: '#/components/schemas/InputField' + type: array + steps: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + minItems: 1 + type: array + result: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ + type: string + required: + - steps + - result + type: object + WorkflowDefinitionRequest: + additionalProperties: false + properties: + format_version: + const: 2 + default: 2 + type: integer + inputs: + items: + $ref: '#/components/schemas/InputField' + type: array + steps: + items: + discriminator: + mapping: + agent: '#/components/schemas/AgentStep' + approval: '#/components/schemas/ApprovalBlock' + connection: '#/components/schemas/ConnectionStep' + edit_fields: '#/components/schemas/EditFieldsStep' + for_each: '#/components/schemas/ForEachBlock' + if: '#/components/schemas/IfBlock' + merge: '#/components/schemas/MergeStep' + parallel: '#/components/schemas/ParallelBlock' + propertyName: kind + oneOf: + - $ref: '#/components/schemas/AgentStep' + - $ref: '#/components/schemas/ConnectionStep' + - $ref: '#/components/schemas/EditFieldsStep' + - $ref: '#/components/schemas/MergeStep' + - $ref: '#/components/schemas/IfBlock' + - $ref: '#/components/schemas/ForEachBlock' + - $ref: '#/components/schemas/ApprovalBlock' + - $ref: '#/components/schemas/ParallelBlock' + minItems: 1 + type: array + result: + maxLength: 200 + pattern: ^[A-Za-z_]\w*$ type: string - config: - type: object - additionalProperties: {} - auth_config: - type: object - additionalProperties: {} - dynamic_inputs: - type: object - additionalProperties: - type: string - minLength: 1 - UpdatePolicy: + required: + - steps + - result + type: object + WorkflowDetail: type: object - description: Serializer for updating policy metadata (name, description) properties: id: type: string @@ -6841,158 +8426,286 @@ components: readOnly: true name: type: string - maxLength: 255 - description: - type: string - organization_id: + maxLength: 200 + agent_id: type: string format: uuid readOnly: true + description: The workflow's id as an agent. Calling a workflow by it is + deprecated; the agent_id filter finds the workflow it belongs to. current_version_id: type: - string - 'null' format: uuid readOnly: true + creator: + oneOf: + - $ref: '#/components/schemas/UserInfo' + - type: 'null' + readOnly: true created_at: type: string format: date-time - readOnly: true updated_at: type: string format: date-time readOnly: true + current_version: + oneOf: + - $ref: '#/components/schemas/WorkflowVersionDetail' + - type: 'null' + readOnly: true required: - - created_at + - agent_id + - creator + - current_version - current_version_id - id - name - - organization_id - updated_at - UpdatePolicyRequest: + WorkflowRun: type: object - description: Serializer for updating policy metadata (name, description) properties: - name: + id: type: string - minLength: 1 - maxLength: 255 - description: + format: uuid + workflow_id: + type: string + format: uuid + version_id: + type: + - string + - 'null' + format: uuid + status: + $ref: '#/components/schemas/WorkflowRunStatusEnum' + error_message: + type: + - string + - 'null' + created_at: type: string + format: date-time required: - - name - UpdateSkillSet: + - created_at + - error_message + - id + - status + - version_id + - workflow_id + WorkflowRunBatch: type: object - description: Update skill set metadata (name, description, key) only. properties: - id: + runs: + type: array + items: + $ref: '#/components/schemas/WorkflowRun' + required: + - runs + WorkflowRunBatchCreateRequest: + type: object + properties: + inputs: + type: array + items: + type: object + additionalProperties: {} + description: One object of input values per run. + maxItems: 100000 + minItems: 1 + version_id: type: string format: uuid - readOnly: true - name: + description: The version to run. Defaults to the current one. + required: + - inputs + WorkflowRunCreateRequest: + type: object + properties: + inputs: + type: object + additionalProperties: true + description: Values for the workflow's inputs, keyed by input. A file input + takes a file id or URL, or the file itself in a multipart request. + version_id: type: string - maxLength: 255 - description: + format: uuid + description: The version to run. Defaults to the current one. + metadata: + type: object + additionalProperties: true + wait: + type: boolean + default: false + description: Wait up to 60 seconds for the run to finish, then return it + as it stands. + WorkflowRunDetail: + type: object + properties: + id: type: string - organization_id: + format: uuid + workflow_id: type: string format: uuid - readOnly: true - knowledge_base_key_id: + version_id: type: - string - 'null' format: uuid - current_version_id: + status: + $ref: '#/components/schemas/WorkflowRunStatusEnum' + error_message: type: - string - 'null' - format: uuid - readOnly: true created_at: type: string format: date-time - readOnly: true - updated_at: - type: string - format: date-time - readOnly: true + inputs: {} + outputs: + type: + - array + - 'null' + items: {} + description: The result step's output, once the run has finished. + steps: + type: array + items: + $ref: '#/components/schemas/StepRun' required: - created_at - - current_version_id + - error_message - id - - name - - organization_id - - updated_at - User: + - inputs + - outputs + - status + - steps + - version_id + - workflow_id + WorkflowRunStatusEnum: + enum: + - pending + - running + - succeeded + - failed + - cancelled + type: string + description: |- + * `pending` - pending + * `running` - running + * `succeeded` - succeeded + * `failed` - failed + * `cancelled` - cancelled + WorkflowVersion: type: object properties: id: - type: integer - readOnly: true - email: - type: string - format: email - first_name: - type: string - last_name: type: string - display_name: + format: uuid + readOnly: true + workflow_id: type: string + format: uuid readOnly: true - is_staff: - type: boolean - default: false - is_superuser: + version_name: + type: + - string + - 'null' + description: + type: + - string + - 'null' + format_version: + type: integer + maximum: 32767 + minimum: 0 + is_current: type: boolean - default: false - is_active: + readOnly: true + read_only: type: boolean - default: true - date_joined: + readOnly: true + description: 'Saved in the old graph format: it still runs, but can only + be edited by saving a new version.' + created_at: type: string format: date-time - readOnly: true - is_first_login: - type: boolean - default: true - is_email_verified: - type: boolean - default: false - is_mfa_enabled: - type: boolean - default: true required: - - date_joined - - display_name - - email - - first_name - id - - last_name - UserInfo: + - is_current + - read_only + - workflow_id + WorkflowVersionCreateRequest: type: object properties: - id: - type: integer - readOnly: true - email: + definition: + $ref: '#/components/schemas/WorkflowDefinitionRequest' + version_name: type: string - format: email - title: Email address - maxLength: 254 - first_name: + minLength: 1 + maxLength: 200 + description: type: string - maxLength: 150 - last_name: + maxLength: 1024 + required: + - definition + WorkflowVersionDetail: + type: object + properties: + id: type: string - maxLength: 150 - display_name: + format: uuid + readOnly: true + workflow_id: + type: string + format: uuid + readOnly: true + version_name: + type: + - string + - 'null' + description: + type: + - string + - 'null' + format_version: + type: integer + maximum: 32767 + minimum: 0 + is_current: + type: boolean + readOnly: true + read_only: + type: boolean + readOnly: true + description: 'Saved in the old graph format: it still runs, but can only + be edited by saving a new version.' + created_at: type: string + format: date-time + definition: + oneOf: + - $ref: '#/components/schemas/WorkflowDefinition' + - type: 'null' + readOnly: true + description: The steps, in the block format. Null for a read-only version. + input_definitions: {} + conversion_reasons: + type: array + items: + type: string readOnly: true + description: Why a read-only version couldn't be converted to the block + format. required: - - display_name - - email + - conversion_reasons + - definition - id + - is_current + - read_only + - workflow_id securitySchemes: apiKeyAuth: type: http diff --git a/openapi/wrappers.yml b/openapi/wrappers.yml index 2dfd47e..c79a404 100644 --- a/openapi/wrappers.yml +++ b/openapi/wrappers.yml @@ -1362,3 +1362,314 @@ apis: location: path wire_name: id annotation: str + workflows: + class_name: WorkflowsAPI + docstring: Build, version and run block-format workflows. + operations: + - kind: body + method_name: list + docstring: List workflows. + method: GET + path: /v1/workflows/ + endpoint_module: roe._generated.api.workflows.workflows_list + return_type: PaginatedWorkflowList + return_import: roe._generated.models.paginated_workflow_list.PaginatedWorkflowList + inject_organization_id: true + parameters: + - name: page + location: query + wire_name: page + annotation: int | None + default: null + pass_unset_when_none: true + - name: page_size + location: query + wire_name: page_size + annotation: int | None + default: null + pass_unset_when_none: true + - name: search + location: query + wire_name: search + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: create + docstring: Create a workflow from a block-format definition. + method: POST + path: /v1/workflows/ + endpoint_module: roe._generated.api.workflows.workflows_create + return_type: WorkflowDetail + return_import: roe._generated.models.workflow_detail.WorkflowDetail + body_format: dict + inject_organization_id: true + parameters: + - name: name + location: body + wire_name: name + annotation: str + - name: definition + location: body + wire_name: definition + annotation: dict[str, Any] + - name: version_name + location: body + wire_name: version_name + annotation: str | None + default: null + pass_unset_when_none: true + - name: description + location: body + wire_name: description + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: retrieve + docstring: Retrieve a workflow with its current version. + method: GET + path: /v1/workflows/{workflow_id}/ + endpoint_module: roe._generated.api.workflows.workflows_retrieve + return_type: WorkflowDetail + return_import: roe._generated.models.workflow_detail.WorkflowDetail + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - kind: body + method_name: update + docstring: Rename a workflow. + method: PATCH + path: /v1/workflows/{workflow_id}/ + endpoint_module: roe._generated.api.workflows.workflows_partial_update + return_type: WorkflowDetail + return_import: roe._generated.models.workflow_detail.WorkflowDetail + body_format: dict + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: name + location: body + wire_name: name + annotation: str + - kind: body + method_name: delete + docstring: Delete a workflow and its versions. + method: DELETE + path: /v1/workflows/{workflow_id}/ + endpoint_module: roe._generated.api.workflows.workflows_destroy + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - kind: body + method_name: list_versions + docstring: List versions of a workflow, newest first. + method: GET + path: /v1/workflows/{workflow_id}/versions/ + endpoint_module: roe._generated.api.workflows.workflows_versions_list + return_type: PaginatedWorkflowVersionList + return_import: roe._generated.models.paginated_workflow_version_list.PaginatedWorkflowVersionList + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: page + location: query + wire_name: page + annotation: int | None + default: null + pass_unset_when_none: true + - name: page_size + location: query + wire_name: page_size + annotation: int | None + default: null + pass_unset_when_none: true + - kind: body + method_name: create_version + docstring: Save a new version of a workflow and make it current. + method: POST + path: /v1/workflows/{workflow_id}/versions/ + endpoint_module: roe._generated.api.workflows.workflows_versions_create + return_type: WorkflowVersionDetail + return_import: roe._generated.models.workflow_version_detail.WorkflowVersionDetail + body_format: dict + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: definition + location: body + wire_name: definition + annotation: dict[str, Any] + - name: version_name + location: body + wire_name: version_name + annotation: str | None + default: null + pass_unset_when_none: true + - name: description + location: body + wire_name: description + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: retrieve_version + docstring: Retrieve one version of a workflow. + method: GET + path: /v1/workflows/{workflow_id}/versions/{version_id}/ + endpoint_module: roe._generated.api.workflows.workflows_versions_retrieve + return_type: WorkflowVersionDetail + return_import: roe._generated.models.workflow_version_detail.WorkflowVersionDetail + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: version_id + location: path + wire_name: version_id + annotation: str + - kind: body + method_name: set_current_version + docstring: Make a version the one that runs by default. + method: POST + path: /v1/workflows/{workflow_id}/versions/{version_id}/set-current/ + endpoint_module: roe._generated.api.workflows.workflows_versions_set_current_create + return_type: WorkflowVersionDetail + return_import: roe._generated.models.workflow_version_detail.WorkflowVersionDetail + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: version_id + location: path + wire_name: version_id + annotation: str + - kind: body + method_name: list_runs + docstring: List runs of a workflow, newest first. + method: GET + path: /v1/workflows/{workflow_id}/runs/ + endpoint_module: roe._generated.api.workflows.workflows_runs_list + return_type: PaginatedWorkflowRunList + return_import: roe._generated.models.paginated_workflow_run_list.PaginatedWorkflowRunList + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: page + location: query + wire_name: page + annotation: int | None + default: null + pass_unset_when_none: true + - name: page_size + location: query + wire_name: page_size + annotation: int | None + default: null + pass_unset_when_none: true + - name: limit + location: query + wire_name: limit + annotation: int | None + default: null + pass_unset_when_none: true + - kind: body + method_name: run + docstring: Start a run. Set wait to wait up to 60 seconds for it to finish. + method: POST + path: /v1/workflows/{workflow_id}/runs/ + endpoint_module: roe._generated.api.workflows.workflows_runs_create + return_type: WorkflowRunDetail + return_import: roe._generated.models.workflow_run_detail.WorkflowRunDetail + body_format: dict + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: inputs + location: body + wire_name: inputs + annotation: dict[str, Any] | None + default: null + pass_unset_when_none: true + - name: version_id + location: body + wire_name: version_id + annotation: str | None + default: null + pass_unset_when_none: true + - name: metadata + location: body + wire_name: metadata + annotation: dict[str, Any] | None + default: null + pass_unset_when_none: true + - name: wait + location: body + wire_name: wait + annotation: bool | None + default: null + pass_unset_when_none: true + - kind: body + method_name: run_batch + docstring: Start one run per item of inputs. + method: POST + path: /v1/workflows/{workflow_id}/runs/batch/ + endpoint_module: roe._generated.api.workflows.workflows_runs_batch_create + return_type: WorkflowRunBatch + return_import: roe._generated.models.workflow_run_batch.WorkflowRunBatch + body_format: dict + inject_organization_id: true + parameters: + - name: workflow_id + location: path + wire_name: workflow_id + annotation: str + - name: inputs + location: body + wire_name: inputs + annotation: list[dict[str, Any]] + - name: version_id + location: body + wire_name: version_id + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: retrieve_run + docstring: Retrieve a run with its outputs and step results. + method: GET + path: /v1/workflows/runs/{run_id}/ + endpoint_module: roe._generated.api.workflows.workflows_runs_retrieve + return_type: WorkflowRunDetail + return_import: roe._generated.models.workflow_run_detail.WorkflowRunDetail + inject_organization_id: true + parameters: + - name: run_id + location: path + wire_name: run_id + annotation: str diff --git a/pyproject.toml b/pyproject.toml index 6f8bd5d..067f48e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "roe-ai" -version = "1.1.19" +version = "1.1.20" authors = [ { name = "Roe", email = "founders@roe-ai.com" }, ] diff --git a/src/roe/_generated/api/workflows/__init__.py b/src/roe/_generated/api/workflows/__init__.py new file mode 100644 index 0000000..c9921b5 --- /dev/null +++ b/src/roe/_generated/api/workflows/__init__.py @@ -0,0 +1 @@ +""" Contains endpoint functions for accessing the API """ diff --git a/src/roe/_generated/api/workflows/workflows_create.py b/src/roe/_generated/api/workflows/workflows_create.py new file mode 100644 index 0000000..154dc0a --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_create.py @@ -0,0 +1,242 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.workflow_create_request import WorkflowCreateRequest +from ...models.workflow_detail import WorkflowDetail +from ...models.workflows_create_response_400_type_0 import WorkflowsCreateResponse400Type0 +from ...models.workflows_create_response_400_type_1 import WorkflowsCreateResponse400Type1 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + *, + body: WorkflowCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/v1/workflows/", + "params": params, + } + + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1 | None: + if response.status_code == 201: + response_201 = WorkflowDetail.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + def _parse_response_400(data: object) -> WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1: + try: + if not isinstance(data, dict): + raise TypeError() + response_400_type_0 = WorkflowsCreateResponse400Type0.from_dict(data) + + + + return response_400_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + response_400_type_1 = WorkflowsCreateResponse400Type1.from_dict(data) + + + + return response_400_type_1 + + response_400 = _parse_response_400(response.json()) + + return response_400 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: AuthenticatedClient, + body: WorkflowCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1]: + """ Create a workflow + + Create a workflow from a block-format definition; its first version becomes current. A definition + that fails its checks returns each error with the step it belongs to. + + Args: + organization_id (UUID | Unset): + body (WorkflowCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1] + """ + + + kwargs = _get_kwargs( + body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + *, + client: AuthenticatedClient, + body: WorkflowCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1 | None: + """ Create a workflow + + Create a workflow from a block-format definition; its first version becomes current. A definition + that fails its checks returns each error with the step it belongs to. + + Args: + organization_id (UUID | Unset): + body (WorkflowCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1 + """ + + + return sync_detailed( + client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + body: WorkflowCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1]: + """ Create a workflow + + Create a workflow from a block-format definition; its first version becomes current. A definition + that fails its checks returns each error with the step it belongs to. + + Args: + organization_id (UUID | Unset): + body (WorkflowCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1] + """ + + + kwargs = _get_kwargs( + body=body, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + *, + client: AuthenticatedClient, + body: WorkflowCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1 | None: + """ Create a workflow + + Create a workflow from a block-format definition; its first version becomes current. A definition + that fails its checks returns each error with the step it belongs to. + + Args: + organization_id (UUID | Unset): + body (WorkflowCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + WorkflowDetail | WorkflowsCreateResponse400Type0 | WorkflowsCreateResponse400Type1 + """ + + + return (await asyncio_detailed( + client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_destroy.py b/src/roe/_generated/api/workflows/workflows_destroy.py new file mode 100644 index 0000000..ef7fba7 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_destroy.py @@ -0,0 +1,209 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "delete", + "url": "/v1/workflows/{workflow_id}/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Any | ErrorDetailResponse | None: + if response.status_code == 204: + response_204 = cast(Any, None) + return response_204 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Any | ErrorDetailResponse]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse]: + """ Delete a workflow + + Delete a workflow and all its versions. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | ErrorDetailResponse] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | None: + """ Delete a workflow + + Delete a workflow and all its versions. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ErrorDetailResponse + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse]: + """ Delete a workflow + + Delete a workflow and all its versions. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | ErrorDetailResponse] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | None: + """ Delete a workflow + + Delete a workflow and all its versions. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | ErrorDetailResponse + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_list.py b/src/roe/_generated/api/workflows/workflows_list.py new file mode 100644 index 0000000..6387033 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_list.py @@ -0,0 +1,255 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.paginated_workflow_list import PaginatedWorkflowList +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + *, + agent_id: UUID | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_agent_id: str | Unset = UNSET + if not isinstance(agent_id, Unset): + json_agent_id = str(agent_id) + params["agent_id"] = json_agent_id + + params["page"] = page + + params["page_size"] = page_size + + params["search"] = search + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/", + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PaginatedWorkflowList | None: + if response.status_code == 200: + response_200 = PaginatedWorkflowList.from_dict(response.json()) + + + + return response_200 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[PaginatedWorkflowList]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: AuthenticatedClient, + agent_id: UUID | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowList]: + """ List workflows + + List the organization's workflows, most recently updated first. + + Args: + agent_id (UUID | Unset): + page (int | Unset): + page_size (int | Unset): + search (str | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowList] + """ + + + kwargs = _get_kwargs( + agent_id=agent_id, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + *, + client: AuthenticatedClient, + agent_id: UUID | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowList | None: + """ List workflows + + List the organization's workflows, most recently updated first. + + Args: + agent_id (UUID | Unset): + page (int | Unset): + page_size (int | Unset): + search (str | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowList + """ + + + return sync_detailed( + client=client, +agent_id=agent_id, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + agent_id: UUID | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowList]: + """ List workflows + + List the organization's workflows, most recently updated first. + + Args: + agent_id (UUID | Unset): + page (int | Unset): + page_size (int | Unset): + search (str | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowList] + """ + + + kwargs = _get_kwargs( + agent_id=agent_id, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + *, + client: AuthenticatedClient, + agent_id: UUID | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowList | None: + """ List workflows + + List the organization's workflows, most recently updated first. + + Args: + agent_id (UUID | Unset): + page (int | Unset): + page_size (int | Unset): + search (str | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowList + """ + + + return (await asyncio_detailed( + client=client, +agent_id=agent_id, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_partial_update.py b/src/roe/_generated/api/workflows/workflows_partial_update.py new file mode 100644 index 0000000..78e5db2 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_partial_update.py @@ -0,0 +1,261 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.patched_workflow_update_request import PatchedWorkflowUpdateRequest +from ...models.workflow_detail import WorkflowDetail +from ...models.workflows_partial_update_response_400_type_0 import WorkflowsPartialUpdateResponse400Type0 +from ...models.workflows_partial_update_response_400_type_1 import WorkflowsPartialUpdateResponse400Type1 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + body: PatchedWorkflowUpdateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "patch", + "url": "/v1/workflows/{workflow_id}/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + if not isinstance(body, Unset): + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1 | None: + if response.status_code == 200: + response_200 = WorkflowDetail.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 400: + def _parse_response_400(data: object) -> WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1: + try: + if not isinstance(data, dict): + raise TypeError() + response_400_type_0 = WorkflowsPartialUpdateResponse400Type0.from_dict(data) + + + + return response_400_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + response_400_type_1 = WorkflowsPartialUpdateResponse400Type1.from_dict(data) + + + + return response_400_type_1 + + response_400 = _parse_response_400(response.json()) + + return response_400 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: PatchedWorkflowUpdateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1]: + """ Rename a workflow + + Rename a workflow. Its versions are unchanged. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (PatchedWorkflowUpdateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: PatchedWorkflowUpdateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1 | None: + """ Rename a workflow + + Rename a workflow. Its versions are unchanged. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (PatchedWorkflowUpdateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1 + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: PatchedWorkflowUpdateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1]: + """ Rename a workflow + + Rename a workflow. Its versions are unchanged. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (PatchedWorkflowUpdateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: PatchedWorkflowUpdateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1 | None: + """ Rename a workflow + + Rename a workflow. Its versions are unchanged. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (PatchedWorkflowUpdateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowDetail | WorkflowsPartialUpdateResponse400Type0 | WorkflowsPartialUpdateResponse400Type1 + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_retrieve.py b/src/roe/_generated/api/workflows/workflows_retrieve.py new file mode 100644 index 0000000..db1e88e --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_retrieve.py @@ -0,0 +1,213 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_detail import WorkflowDetail +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/{workflow_id}/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowDetail | None: + if response.status_code == 200: + response_200 = WorkflowDetail.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowDetail]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowDetail]: + """ Get a workflow + + Get a workflow with its current version. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowDetail | None: + """ Get a workflow + + Get a workflow with its current version. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowDetail + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowDetail]: + """ Get a workflow + + Get a workflow with its current version. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowDetail | None: + """ Get a workflow + + Get a workflow with its current version. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowDetail + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_runs_batch_create.py b/src/roe/_generated/api/workflows/workflows_runs_batch_create.py new file mode 100644 index 0000000..2ce41e6 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_runs_batch_create.py @@ -0,0 +1,274 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_run_batch import WorkflowRunBatch +from ...models.workflow_run_batch_create_request import WorkflowRunBatchCreateRequest +from ...models.workflows_runs_batch_create_response_400_type_1 import WorkflowsRunsBatchCreateResponse400Type1 +from ...models.workflows_runs_batch_create_response_400_type_2 import WorkflowsRunsBatchCreateResponse400Type2 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + body: WorkflowRunBatchCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/v1/workflows/{workflow_id}/runs/batch/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2 | None: + if response.status_code == 201: + response_201 = WorkflowRunBatch.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + def _parse_response_400(data: object) -> list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2: + try: + if not isinstance(data, list): + raise TypeError() + response_400_type_0 = cast(list[str], data) + + return response_400_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + response_400_type_1 = WorkflowsRunsBatchCreateResponse400Type1.from_dict(data) + + + + return response_400_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + response_400_type_2 = WorkflowsRunsBatchCreateResponse400Type2.from_dict(data) + + + + return response_400_type_2 + + response_400 = _parse_response_400(response.json()) + + return response_400 + + if response.status_code == 403: + response_403 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_403 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunBatchCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2]: + """ Run a workflow in batch + + Start one run per item of inputs. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunBatchCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunBatchCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2 | None: + """ Run a workflow in batch + + Start one run per item of inputs. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunBatchCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2 + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunBatchCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2]: + """ Run a workflow in batch + + Start one run per item of inputs. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunBatchCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunBatchCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2 | None: + """ Run a workflow in batch + + Start one run per item of inputs. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunBatchCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunBatch | list[str] | WorkflowsRunsBatchCreateResponse400Type1 | WorkflowsRunsBatchCreateResponse400Type2 + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_runs_create.py b/src/roe/_generated/api/workflows/workflows_runs_create.py new file mode 100644 index 0000000..0f87279 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_runs_create.py @@ -0,0 +1,280 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_run_create_request import WorkflowRunCreateRequest +from ...models.workflow_run_detail import WorkflowRunDetail +from ...models.workflows_runs_create_response_400_type_1 import WorkflowsRunsCreateResponse400Type1 +from ...models.workflows_runs_create_response_400_type_2 import WorkflowsRunsCreateResponse400Type2 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + body: WorkflowRunCreateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/v1/workflows/{workflow_id}/runs/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + if not isinstance(body, Unset): + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2 | None: + if response.status_code == 201: + response_201 = WorkflowRunDetail.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + def _parse_response_400(data: object) -> list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2: + try: + if not isinstance(data, list): + raise TypeError() + response_400_type_0 = cast(list[str], data) + + return response_400_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + response_400_type_1 = WorkflowsRunsCreateResponse400Type1.from_dict(data) + + + + return response_400_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + response_400_type_2 = WorkflowsRunsCreateResponse400Type2.from_dict(data) + + + + return response_400_type_2 + + response_400 = _parse_response_400(response.json()) + + return response_400 + + if response.status_code == 403: + response_403 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_403 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunCreateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2]: + """ Run a workflow + + Start a run of the current version, or of version_id. With wait, the response comes when the run + finishes or after 60 seconds, whichever is first. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunCreateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunCreateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2 | None: + """ Run a workflow + + Start a run of the current version, or of version_id. With wait, the response comes when the run + finishes or after 60 seconds, whichever is first. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunCreateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2 + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunCreateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2]: + """ Run a workflow + + Start a run of the current version, or of version_id. With wait, the response comes when the run + finishes or after 60 seconds, whichever is first. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunCreateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowRunCreateRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2 | None: + """ Run a workflow + + Start a run of the current version, or of version_id. With wait, the response comes when the run + finishes or after 60 seconds, whichever is first. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowRunCreateRequest | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunDetail | list[str] | WorkflowsRunsCreateResponse400Type1 | WorkflowsRunsCreateResponse400Type2 + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_runs_list.py b/src/roe/_generated/api/workflows/workflows_runs_list.py new file mode 100644 index 0000000..b13f474 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_runs_list.py @@ -0,0 +1,250 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.paginated_workflow_run_list import PaginatedWorkflowRunList +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + limit: int | Unset = 100000, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + params["limit"] = limit + + params["page"] = page + + params["page_size"] = page_size + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/{workflow_id}/runs/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PaginatedWorkflowRunList | None: + if response.status_code == 200: + response_200 = PaginatedWorkflowRunList.from_dict(response.json()) + + + + return response_200 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[PaginatedWorkflowRunList]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + limit: int | Unset = 100000, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowRunList]: + """ List workflow runs + + List a workflow's runs, newest first. + + Args: + workflow_id (UUID): + limit (int | Unset): Default: 100000. + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowRunList] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +limit=limit, +page=page, +page_size=page_size, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + limit: int | Unset = 100000, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowRunList | None: + """ List workflow runs + + List a workflow's runs, newest first. + + Args: + workflow_id (UUID): + limit (int | Unset): Default: 100000. + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowRunList + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +limit=limit, +page=page, +page_size=page_size, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + limit: int | Unset = 100000, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowRunList]: + """ List workflow runs + + List a workflow's runs, newest first. + + Args: + workflow_id (UUID): + limit (int | Unset): Default: 100000. + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowRunList] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +limit=limit, +page=page, +page_size=page_size, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + limit: int | Unset = 100000, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowRunList | None: + """ List workflow runs + + List a workflow's runs, newest first. + + Args: + workflow_id (UUID): + limit (int | Unset): Default: 100000. + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowRunList + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +limit=limit, +page=page, +page_size=page_size, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_runs_retrieve.py b/src/roe/_generated/api/workflows/workflows_runs_retrieve.py new file mode 100644 index 0000000..5640a6f --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_runs_retrieve.py @@ -0,0 +1,213 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_run_detail import WorkflowRunDetail +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + run_id: UUID, + *, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/runs/{run_id}/".format(run_id=quote(str(run_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowRunDetail | None: + if response.status_code == 200: + response_200 = WorkflowRunDetail.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowRunDetail]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunDetail]: + """ Get a workflow run + + Get a run with its outputs once it has finished, and what each step received and returned. + + Args: + run_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunDetail] + """ + + + kwargs = _get_kwargs( + run_id=run_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunDetail | None: + """ Get a workflow run + + Get a run with its outputs once it has finished, and what each step received and returned. + + Args: + run_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunDetail + """ + + + return sync_detailed( + run_id=run_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowRunDetail]: + """ Get a workflow run + + Get a run with its outputs once it has finished, and what each step received and returned. + + Args: + run_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowRunDetail] + """ + + + kwargs = _get_kwargs( + run_id=run_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowRunDetail | None: + """ Get a workflow run + + Get a run with its outputs once it has finished, and what each step received and returned. + + Args: + run_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowRunDetail + """ + + + return (await asyncio_detailed( + run_id=run_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_versions_create.py b/src/roe/_generated/api/workflows/workflows_versions_create.py new file mode 100644 index 0000000..59e59b2 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_versions_create.py @@ -0,0 +1,263 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_version_create_request import WorkflowVersionCreateRequest +from ...models.workflow_version_detail import WorkflowVersionDetail +from ...models.workflows_versions_create_response_400_type_0 import WorkflowsVersionsCreateResponse400Type0 +from ...models.workflows_versions_create_response_400_type_1 import WorkflowsVersionsCreateResponse400Type1 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + body: WorkflowVersionCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/v1/workflows/{workflow_id}/versions/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1 | None: + if response.status_code == 201: + response_201 = WorkflowVersionDetail.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + def _parse_response_400(data: object) -> WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1: + try: + if not isinstance(data, dict): + raise TypeError() + response_400_type_0 = WorkflowsVersionsCreateResponse400Type0.from_dict(data) + + + + return response_400_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + response_400_type_1 = WorkflowsVersionsCreateResponse400Type1.from_dict(data) + + + + return response_400_type_1 + + response_400 = _parse_response_400(response.json()) + + return response_400 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowVersionCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1]: + """ Save a workflow version + + Save a new version from a complete block-format definition and make it current. Agent versions stay + pinned as given, and the current version's post actions carry over. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowVersionCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowVersionCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1 | None: + """ Save a workflow version + + Save a new version from a complete block-format definition and make it current. Agent versions stay + pinned as given, and the current version's post actions carry over. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowVersionCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1 + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowVersionCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1]: + """ Save a workflow version + + Save a new version from a complete block-format definition and make it current. Agent versions stay + pinned as given, and the current version's post actions carry over. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowVersionCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +body=body, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + body: WorkflowVersionCreateRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1 | None: + """ Save a workflow version + + Save a new version from a complete block-format definition and make it current. Agent versions stay + pinned as given, and the current version's post actions carry over. + + Args: + workflow_id (UUID): + organization_id (UUID | Unset): + body (WorkflowVersionCreateRequest): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail | WorkflowsVersionsCreateResponse400Type0 | WorkflowsVersionsCreateResponse400Type1 + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_versions_list.py b/src/roe/_generated/api/workflows/workflows_versions_list.py new file mode 100644 index 0000000..d13bbd1 --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_versions_list.py @@ -0,0 +1,235 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.paginated_workflow_version_list import PaginatedWorkflowVersionList +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + *, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + params["page"] = page + + params["page_size"] = page_size + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/{workflow_id}/versions/".format(workflow_id=quote(str(workflow_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PaginatedWorkflowVersionList | None: + if response.status_code == 200: + response_200 = PaginatedWorkflowVersionList.from_dict(response.json()) + + + + return response_200 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[PaginatedWorkflowVersionList]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowVersionList]: + """ List workflow versions + + List a workflow's versions, newest first. + + Args: + workflow_id (UUID): + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowVersionList] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +page=page, +page_size=page_size, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowVersionList | None: + """ List workflow versions + + List a workflow's versions, newest first. + + Args: + workflow_id (UUID): + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowVersionList + """ + + + return sync_detailed( + workflow_id=workflow_id, +client=client, +page=page, +page_size=page_size, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedWorkflowVersionList]: + """ List workflow versions + + List a workflow's versions, newest first. + + Args: + workflow_id (UUID): + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[PaginatedWorkflowVersionList] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +page=page, +page_size=page_size, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedWorkflowVersionList | None: + """ List workflow versions + + List a workflow's versions, newest first. + + Args: + workflow_id (UUID): + page (int | Unset): + page_size (int | Unset): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + PaginatedWorkflowVersionList + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +client=client, +page=page, +page_size=page_size, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_versions_retrieve.py b/src/roe/_generated/api/workflows/workflows_versions_retrieve.py new file mode 100644 index 0000000..d32dabe --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_versions_retrieve.py @@ -0,0 +1,230 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_version_detail import WorkflowVersionDetail +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + version_id: UUID, + *, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/v1/workflows/{workflow_id}/versions/{version_id}/".format(workflow_id=quote(str(workflow_id), safe=""),version_id=quote(str(version_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowVersionDetail | None: + if response.status_code == 200: + response_200 = WorkflowVersionDetail.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + """ Get a workflow version + + Get one version with its definition. A version saved in the old format is read-only: its definition + is null and conversion_reasons says why. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +version_id=version_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | None: + """ Get a workflow version + + Get one version with its definition. A version saved in the old format is read-only: its definition + is null and conversion_reasons says why. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail + """ + + + return sync_detailed( + workflow_id=workflow_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + """ Get a workflow version + + Get one version with its definition. A version saved in the old format is read-only: its definition + is null and conversion_reasons says why. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +version_id=version_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | None: + """ Get a workflow version + + Get one version with its definition. A version saved in the old format is read-only: its definition + is null and conversion_reasons says why. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/workflows/workflows_versions_set_current_create.py b/src/roe/_generated/api/workflows/workflows_versions_set_current_create.py new file mode 100644 index 0000000..367baac --- /dev/null +++ b/src/roe/_generated/api/workflows/workflows_versions_set_current_create.py @@ -0,0 +1,226 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_detail_response import ErrorDetailResponse +from ...models.workflow_version_detail import WorkflowVersionDetail +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + workflow_id: UUID, + version_id: UUID, + *, + organization_id: UUID | Unset = UNSET, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + json_organization_id: str | Unset = UNSET + if not isinstance(organization_id, Unset): + json_organization_id = str(organization_id) + params["organization_id"] = json_organization_id + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/v1/workflows/{workflow_id}/versions/{version_id}/set-current/".format(workflow_id=quote(str(workflow_id), safe=""),version_id=quote(str(version_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | WorkflowVersionDetail | None: + if response.status_code == 200: + response_200 = WorkflowVersionDetail.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 404: + response_404 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_404 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + """ Set the current workflow version + + Make a version the one that runs by default. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +version_id=version_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | None: + """ Set the current workflow version + + Make a version the one that runs by default. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail + """ + + + return sync_detailed( + workflow_id=workflow_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | WorkflowVersionDetail]: + """ Set the current workflow version + + Make a version the one that runs by default. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorDetailResponse | WorkflowVersionDetail] + """ + + + kwargs = _get_kwargs( + workflow_id=workflow_id, +version_id=version_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + workflow_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | WorkflowVersionDetail | None: + """ Set the current workflow version + + Make a version the one that runs by default. + + Args: + workflow_id (UUID): + version_id (UUID): + organization_id (UUID | Unset): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorDetailResponse | WorkflowVersionDetail + """ + + + return (await asyncio_detailed( + workflow_id=workflow_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/models/__init__.py b/src/roe/_generated/models/__init__.py index b0770af..b6696c8 100644 --- a/src/roe/_generated/models/__init__.py +++ b/src/roe/_generated/models/__init__.py @@ -19,6 +19,8 @@ from .agent_job_status_many_request import AgentJobStatusManyRequest from .agent_job_webhook_resend_response import AgentJobWebhookResendResponse from .agent_run_async_many_request import AgentRunAsyncManyRequest +from .agent_step import AgentStep +from .agent_step_input_mapping import AgentStepInputMapping from .agent_tag import AgentTag from .agent_version import AgentVersion from .agent_version_create_request import AgentVersionCreateRequest @@ -46,10 +48,13 @@ from .agents_update_response_400 import AgentsUpdateResponse400 from .agents_versions_create_response_400 import AgentsVersionsCreateResponse400 from .api_error_response import ApiErrorResponse +from .approval_block import ApprovalBlock from .base_agent import BaseAgent from .base_agent_create_request import BaseAgentCreateRequest from .base_agent_update_request import BaseAgentUpdateRequest from .color_enum import ColorEnum +from .combine_enum import CombineEnum +from .condition import Condition from .connection import Connection from .connection_auth_config import ConnectionAuthConfig from .connection_authentication_check import ConnectionAuthenticationCheck @@ -59,6 +64,8 @@ from .connection_dynamic_inputs import ConnectionDynamicInputs from .connection_list import ConnectionList from .connection_list_dynamic_inputs import ConnectionListDynamicInputs +from .connection_step import ConnectionStep +from .connection_step_input_mapping import ConnectionStepInputMapping from .connections_create_response_400_type_1 import ConnectionsCreateResponse400Type1 from .connections_create_response_400_type_2 import ConnectionsCreateResponse400Type2 from .connections_list_response_400 import ConnectionsListResponse400 @@ -92,13 +99,22 @@ from .discovery_supported_models_list_response_400 import DiscoverySupportedModelsListResponse400 from .duplicate_connection_existing import DuplicateConnectionExisting from .duplicate_connection_response import DuplicateConnectionResponse +from .edit_fields_step import EditFieldsStep +from .edit_fields_step_fields import EditFieldsStepFields from .error_detail_response import ErrorDetailResponse +from .for_each_block import ForEachBlock +from .gate_kind import GateKind from .generate_skill_set_version_request import GenerateSkillSetVersionRequest from .generate_skill_set_version_response import GenerateSkillSetVersionResponse +from .if_block import IfBlock +from .input_field import InputField from .job_input import JobInput from .list_agent_job import ListAgentJob from .list_agent_job_metadata import ListAgentJobMetadata +from .merge_step import MergeStep from .message_response import MessageResponse +from .mode_enum import ModeEnum +from .operator_enum import OperatorEnum from .paginated_base_agent_list import PaginatedBaseAgentList from .paginated_connection_list_list import PaginatedConnectionListList from .paginated_list_agent_job_list import PaginatedListAgentJobList @@ -106,6 +122,10 @@ from .paginated_policy_version_list import PaginatedPolicyVersionList from .paginated_skill_set_list import PaginatedSkillSetList from .paginated_skill_set_version_list import PaginatedSkillSetVersionList +from .paginated_workflow_list import PaginatedWorkflowList +from .paginated_workflow_run_list import PaginatedWorkflowRunList +from .paginated_workflow_version_list import PaginatedWorkflowVersionList +from .parallel_block import ParallelBlock from .patched_agent_version_update_request import PatchedAgentVersionUpdateRequest from .patched_base_agent_update_request import PatchedBaseAgentUpdateRequest from .patched_update_connection_request import PatchedUpdateConnectionRequest @@ -114,6 +134,7 @@ from .patched_update_connection_request_dynamic_inputs import PatchedUpdateConnectionRequestDynamicInputs from .patched_update_policy_request import PatchedUpdatePolicyRequest from .patched_update_skill_set_request import PatchedUpdateSkillSetRequest +from .patched_workflow_update_request import PatchedWorkflowUpdateRequest from .policies_create_response_400 import PoliciesCreateResponse400 from .policies_partial_update_response_400 import PoliciesPartialUpdateResponse400 from .policies_update_response_400 import PoliciesUpdateResponse400 @@ -146,6 +167,9 @@ from .skill_sets_generate_version_response_400 import SkillSetsGenerateVersionResponse400 from .skill_sets_versions_create_response_400 import SkillSetsVersionsCreateResponse400 from .status_enum import StatusEnum +from .step_run import StepRun +from .step_run_delivery_enum import StepRunDeliveryEnum +from .step_run_status_enum import StepRunStatusEnum from .supported_llm_model import SupportedLLMModel from .supported_llm_model_list import SupportedLLMModelList from .table import Table @@ -181,6 +205,36 @@ from .upload_table_response_400_type_2 import UploadTableResponse400Type2 from .user import User from .user_info import UserInfo +from .workflow import Workflow +from .workflow_create_request import WorkflowCreateRequest +from .workflow_definition import WorkflowDefinition +from .workflow_definition_request import WorkflowDefinitionRequest +from .workflow_detail import WorkflowDetail +from .workflow_run import WorkflowRun +from .workflow_run_batch import WorkflowRunBatch +from .workflow_run_batch_create_request import WorkflowRunBatchCreateRequest +from .workflow_run_batch_create_request_inputs_item import WorkflowRunBatchCreateRequestInputsItem +from .workflow_run_create_request import WorkflowRunCreateRequest +from .workflow_run_create_request_inputs import WorkflowRunCreateRequestInputs +from .workflow_run_create_request_metadata import WorkflowRunCreateRequestMetadata +from .workflow_run_detail import WorkflowRunDetail +from .workflow_run_status_enum import WorkflowRunStatusEnum +from .workflow_version import WorkflowVersion +from .workflow_version_create_request import WorkflowVersionCreateRequest +from .workflow_version_detail import WorkflowVersionDetail +from .workflows_create_response_400_type_0 import WorkflowsCreateResponse400Type0 +from .workflows_create_response_400_type_1 import WorkflowsCreateResponse400Type1 +from .workflows_create_response_400_type_1_errors_item import WorkflowsCreateResponse400Type1ErrorsItem +from .workflows_partial_update_response_400_type_0 import WorkflowsPartialUpdateResponse400Type0 +from .workflows_partial_update_response_400_type_1 import WorkflowsPartialUpdateResponse400Type1 +from .workflows_partial_update_response_400_type_1_errors_item import WorkflowsPartialUpdateResponse400Type1ErrorsItem +from .workflows_runs_batch_create_response_400_type_1 import WorkflowsRunsBatchCreateResponse400Type1 +from .workflows_runs_batch_create_response_400_type_2 import WorkflowsRunsBatchCreateResponse400Type2 +from .workflows_runs_create_response_400_type_1 import WorkflowsRunsCreateResponse400Type1 +from .workflows_runs_create_response_400_type_2 import WorkflowsRunsCreateResponse400Type2 +from .workflows_versions_create_response_400_type_0 import WorkflowsVersionsCreateResponse400Type0 +from .workflows_versions_create_response_400_type_1 import WorkflowsVersionsCreateResponse400Type1 +from .workflows_versions_create_response_400_type_1_errors_item import WorkflowsVersionsCreateResponse400Type1ErrorsItem __all__ = ( "AgentDatum", @@ -222,6 +276,8 @@ "AgentsRunVersionResponse400Type2", "AgentsRunVersionsAsyncCreateResponse400Type1", "AgentsRunVersionsAsyncCreateResponse400Type2", + "AgentStep", + "AgentStepInputMapping", "AgentsUpdateResponse400", "AgentsVersionsCreateResponse400", "AgentTag", @@ -229,10 +285,13 @@ "AgentVersionCreateRequest", "AgentVersionUpdateRequest", "ApiErrorResponse", + "ApprovalBlock", "BaseAgent", "BaseAgentCreateRequest", "BaseAgentUpdateRequest", "ColorEnum", + "CombineEnum", + "Condition", "Connection", "ConnectionAuthConfig", "ConnectionAuthenticationCheck", @@ -247,6 +306,8 @@ "ConnectionsListResponse400", "ConnectionsPartialUpdateResponse400Type1", "ConnectionsPartialUpdateResponse400Type2", + "ConnectionStep", + "ConnectionStepInputMapping", "ConnectionsTestCredentialsCreateResponse400Type0", "ConnectionsTestCredentialsCreateResponse400Type1", "ConnectionsUpdateResponse400Type1", @@ -275,13 +336,22 @@ "DiscoverySupportedModelsListResponse400", "DuplicateConnectionExisting", "DuplicateConnectionResponse", + "EditFieldsStep", + "EditFieldsStepFields", "ErrorDetailResponse", + "ForEachBlock", + "GateKind", "GenerateSkillSetVersionRequest", "GenerateSkillSetVersionResponse", + "IfBlock", + "InputField", "JobInput", "ListAgentJob", "ListAgentJobMetadata", + "MergeStep", "MessageResponse", + "ModeEnum", + "OperatorEnum", "PaginatedBaseAgentList", "PaginatedConnectionListList", "PaginatedListAgentJobList", @@ -289,6 +359,10 @@ "PaginatedPolicyVersionList", "PaginatedSkillSetList", "PaginatedSkillSetVersionList", + "PaginatedWorkflowList", + "PaginatedWorkflowRunList", + "PaginatedWorkflowVersionList", + "ParallelBlock", "PatchedAgentVersionUpdateRequest", "PatchedBaseAgentUpdateRequest", "PatchedUpdateConnectionRequest", @@ -297,6 +371,7 @@ "PatchedUpdateConnectionRequestDynamicInputs", "PatchedUpdatePolicyRequest", "PatchedUpdateSkillSetRequest", + "PatchedWorkflowUpdateRequest", "PoliciesCreateResponse400", "PoliciesPartialUpdateResponse400", "PoliciesUpdateResponse400", @@ -329,6 +404,9 @@ "SkillSetVersion", "SkillSetVersionCreatedBy", "StatusEnum", + "StepRun", + "StepRunDeliveryEnum", + "StepRunStatusEnum", "SupportedLLMModel", "SupportedLLMModelList", "Table", @@ -364,4 +442,34 @@ "UploadTableResponse400Type2", "User", "UserInfo", + "Workflow", + "WorkflowCreateRequest", + "WorkflowDefinition", + "WorkflowDefinitionRequest", + "WorkflowDetail", + "WorkflowRun", + "WorkflowRunBatch", + "WorkflowRunBatchCreateRequest", + "WorkflowRunBatchCreateRequestInputsItem", + "WorkflowRunCreateRequest", + "WorkflowRunCreateRequestInputs", + "WorkflowRunCreateRequestMetadata", + "WorkflowRunDetail", + "WorkflowRunStatusEnum", + "WorkflowsCreateResponse400Type0", + "WorkflowsCreateResponse400Type1", + "WorkflowsCreateResponse400Type1ErrorsItem", + "WorkflowsPartialUpdateResponse400Type0", + "WorkflowsPartialUpdateResponse400Type1", + "WorkflowsPartialUpdateResponse400Type1ErrorsItem", + "WorkflowsRunsBatchCreateResponse400Type1", + "WorkflowsRunsBatchCreateResponse400Type2", + "WorkflowsRunsCreateResponse400Type1", + "WorkflowsRunsCreateResponse400Type2", + "WorkflowsVersionsCreateResponse400Type0", + "WorkflowsVersionsCreateResponse400Type1", + "WorkflowsVersionsCreateResponse400Type1ErrorsItem", + "WorkflowVersion", + "WorkflowVersionCreateRequest", + "WorkflowVersionDetail", ) diff --git a/src/roe/_generated/models/agent_step.py b/src/roe/_generated/models/agent_step.py new file mode 100644 index 0000000..a88c579 --- /dev/null +++ b/src/roe/_generated/models/agent_step.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step_input_mapping import AgentStepInputMapping + + + + + +T = TypeVar("T", bound="AgentStep") + + + +@_attrs_define +class AgentStep: + """ + Attributes: + id (str): + kind (Literal['agent']): Default: 'agent'. + base_agent_id (str): + agent_version_id (str): + input_mapping (AgentStepInputMapping | Unset): + """ + + id: str + base_agent_id: str + agent_version_id: str + kind: Literal['agent'] = 'agent' + input_mapping: AgentStepInputMapping | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step_input_mapping import AgentStepInputMapping + id = self.id + + kind = self.kind + + base_agent_id = self.base_agent_id + + agent_version_id = self.agent_version_id + + input_mapping: dict[str, Any] | Unset = UNSET + if not isinstance(self.input_mapping, Unset): + input_mapping = self.input_mapping.to_dict() + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "base_agent_id": base_agent_id, + "agent_version_id": agent_version_id, + }) + if input_mapping is not UNSET: + field_dict["input_mapping"] = input_mapping + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step_input_mapping import AgentStepInputMapping + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['agent'] , d.pop("kind")) + if kind != 'agent': + raise ValueError(f"kind must match const 'agent', got '{kind}'") + + base_agent_id = d.pop("base_agent_id") + + agent_version_id = d.pop("agent_version_id") + + _input_mapping = d.pop("input_mapping", UNSET) + input_mapping: AgentStepInputMapping | Unset + if isinstance(_input_mapping, Unset): + input_mapping = UNSET + else: + input_mapping = AgentStepInputMapping.from_dict(_input_mapping) + + + + + agent_step = cls( + id=id, + kind=kind, + base_agent_id=base_agent_id, + agent_version_id=agent_version_id, + input_mapping=input_mapping, + ) + + return agent_step + diff --git a/src/roe/_generated/models/agent_step_input_mapping.py b/src/roe/_generated/models/agent_step_input_mapping.py new file mode 100644 index 0000000..3d09404 --- /dev/null +++ b/src/roe/_generated/models/agent_step_input_mapping.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="AgentStepInputMapping") + + + +@_attrs_define +class AgentStepInputMapping: + """ + """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + agent_step_input_mapping = cls( + ) + + + agent_step_input_mapping.additional_properties = d + return agent_step_input_mapping + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/approval_block.py b/src/roe/_generated/models/approval_block.py new file mode 100644 index 0000000..6d85e6b --- /dev/null +++ b/src/roe/_generated/models/approval_block.py @@ -0,0 +1,232 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.gate_kind import GateKind +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + + + + + +T = TypeVar("T", bound="ApprovalBlock") + + + +@_attrs_define +class ApprovalBlock: + """ Steps that run once someone approves the agent step just before. + + Attributes: + id (str): + kind (Literal['approval']): Default: 'approval'. + steps (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | + ParallelBlock]): + approval (GateKind | Unset): What opens a gate: an org admin's explicit approval (manual) or the + reviewer's verdict decision on the source agent's result (feedback). + """ + + id: str + steps: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] + kind: Literal['approval'] = 'approval' + approval: GateKind | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + id = self.id + + kind = self.kind + + steps = [] + for steps_item_data in self.steps: + steps_item: dict[str, Any] + if isinstance(steps_item_data, AgentStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ConnectionStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, EditFieldsStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, MergeStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, IfBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ForEachBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ApprovalBlock): + steps_item = steps_item_data.to_dict() + else: + steps_item = steps_item_data.to_dict() + + steps.append(steps_item) + + + + approval: str | Unset = UNSET + if not isinstance(self.approval, Unset): + approval = self.approval.value + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "steps": steps, + }) + if approval is not UNSET: + field_dict["approval"] = approval + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['approval'] , d.pop("kind")) + if kind != 'approval': + raise ValueError(f"kind must match const 'approval', got '{kind}'") + + steps = [] + _steps = d.pop("steps") + for steps_item_data in (_steps): + def _parse_steps_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_0 = AgentStep.from_dict(data) + + + + return steps_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_1 = ConnectionStep.from_dict(data) + + + + return steps_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_2 = EditFieldsStep.from_dict(data) + + + + return steps_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_3 = MergeStep.from_dict(data) + + + + return steps_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_4 = IfBlock.from_dict(data) + + + + return steps_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_5 = ForEachBlock.from_dict(data) + + + + return steps_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_6 = ApprovalBlock.from_dict(data) + + + + return steps_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + steps_item_type_7 = ParallelBlock.from_dict(data) + + + + return steps_item_type_7 + + steps_item = _parse_steps_item(steps_item_data) + + steps.append(steps_item) + + + _approval = d.pop("approval", UNSET) + approval: GateKind | Unset + if isinstance(_approval, Unset): + approval = UNSET + else: + approval = GateKind(_approval) + + + + + approval_block = cls( + id=id, + kind=kind, + steps=steps, + approval=approval, + ) + + return approval_block + diff --git a/src/roe/_generated/models/combine_enum.py b/src/roe/_generated/models/combine_enum.py new file mode 100644 index 0000000..2f3c6d3 --- /dev/null +++ b/src/roe/_generated/models/combine_enum.py @@ -0,0 +1,8 @@ +from enum import Enum + +class CombineEnum(str, Enum): + ALL = "all" + ANY = "any" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/condition.py b/src/roe/_generated/models/condition.py new file mode 100644 index 0000000..084dc25 --- /dev/null +++ b/src/roe/_generated/models/condition.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.operator_enum import OperatorEnum +from ..types import UNSET, Unset + + + + + + +T = TypeVar("T", bound="Condition") + + + +@_attrs_define +class Condition: + """ + Attributes: + field (str): + operator (OperatorEnum | Unset): Default: OperatorEnum.EQUALS. + value (Any | Unset): + """ + + field: str + operator: OperatorEnum | Unset = OperatorEnum.EQUALS + value: Any | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + field = self.field + + operator: str | Unset = UNSET + if not isinstance(self.operator, Unset): + operator = self.operator.value + + + value = self.value + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "field": field, + }) + if operator is not UNSET: + field_dict["operator"] = operator + if value is not UNSET: + field_dict["value"] = value + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + field = d.pop("field") + + _operator = d.pop("operator", UNSET) + operator: OperatorEnum | Unset + if isinstance(_operator, Unset): + operator = UNSET + else: + operator = OperatorEnum(_operator) + + + + + value = d.pop("value", UNSET) + + condition = cls( + field=field, + operator=operator, + value=value, + ) + + return condition + diff --git a/src/roe/_generated/models/connection_step.py b/src/roe/_generated/models/connection_step.py new file mode 100644 index 0000000..b9a0352 --- /dev/null +++ b/src/roe/_generated/models/connection_step.py @@ -0,0 +1,133 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.connection_step_input_mapping import ConnectionStepInputMapping + + + + + +T = TypeVar("T", bound="ConnectionStep") + + + +@_attrs_define +class ConnectionStep: + """ Calls one operation of a saved connection, such as an API lookup or a + Slack message. Credentials stay with the connection. + + Attributes: + id (str): + kind (Literal['connection']): Default: 'connection'. + connection_id (str): + operation (str): + setup_id (None | str | Unset): + input_mapping (ConnectionStepInputMapping | Unset): + """ + + id: str + connection_id: str + operation: str + kind: Literal['connection'] = 'connection' + setup_id: None | str | Unset = UNSET + input_mapping: ConnectionStepInputMapping | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.connection_step_input_mapping import ConnectionStepInputMapping + id = self.id + + kind = self.kind + + connection_id = self.connection_id + + operation = self.operation + + setup_id: None | str | Unset + if isinstance(self.setup_id, Unset): + setup_id = UNSET + else: + setup_id = self.setup_id + + input_mapping: dict[str, Any] | Unset = UNSET + if not isinstance(self.input_mapping, Unset): + input_mapping = self.input_mapping.to_dict() + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "connection_id": connection_id, + "operation": operation, + }) + if setup_id is not UNSET: + field_dict["setup_id"] = setup_id + if input_mapping is not UNSET: + field_dict["input_mapping"] = input_mapping + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.connection_step_input_mapping import ConnectionStepInputMapping + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['connection'] , d.pop("kind")) + if kind != 'connection': + raise ValueError(f"kind must match const 'connection', got '{kind}'") + + connection_id = d.pop("connection_id") + + operation = d.pop("operation") + + def _parse_setup_id(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + setup_id = _parse_setup_id(d.pop("setup_id", UNSET)) + + + _input_mapping = d.pop("input_mapping", UNSET) + input_mapping: ConnectionStepInputMapping | Unset + if isinstance(_input_mapping, Unset): + input_mapping = UNSET + else: + input_mapping = ConnectionStepInputMapping.from_dict(_input_mapping) + + + + + connection_step = cls( + id=id, + kind=kind, + connection_id=connection_id, + operation=operation, + setup_id=setup_id, + input_mapping=input_mapping, + ) + + return connection_step + diff --git a/src/roe/_generated/models/connection_step_input_mapping.py b/src/roe/_generated/models/connection_step_input_mapping.py new file mode 100644 index 0000000..68b5002 --- /dev/null +++ b/src/roe/_generated/models/connection_step_input_mapping.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="ConnectionStepInputMapping") + + + +@_attrs_define +class ConnectionStepInputMapping: + """ + """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + connection_step_input_mapping = cls( + ) + + + connection_step_input_mapping.additional_properties = d + return connection_step_input_mapping + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/edit_fields_step.py b/src/roe/_generated/models/edit_fields_step.py new file mode 100644 index 0000000..cdf2354 --- /dev/null +++ b/src/roe/_generated/models/edit_fields_step.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.edit_fields_step_fields import EditFieldsStepFields + + + + + +T = TypeVar("T", bound="EditFieldsStep") + + + +@_attrs_define +class EditFieldsStep: + """ + Attributes: + id (str): + kind (Literal['edit_fields']): Default: 'edit_fields'. + fields (EditFieldsStepFields): + """ + + id: str + fields: EditFieldsStepFields + kind: Literal['edit_fields'] = 'edit_fields' + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.edit_fields_step_fields import EditFieldsStepFields + id = self.id + + kind = self.kind + + fields = self.fields.to_dict() + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "fields": fields, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.edit_fields_step_fields import EditFieldsStepFields + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['edit_fields'] , d.pop("kind")) + if kind != 'edit_fields': + raise ValueError(f"kind must match const 'edit_fields', got '{kind}'") + + fields = EditFieldsStepFields.from_dict(d.pop("fields")) + + + + + edit_fields_step = cls( + id=id, + kind=kind, + fields=fields, + ) + + return edit_fields_step + diff --git a/src/roe/_generated/models/edit_fields_step_fields.py b/src/roe/_generated/models/edit_fields_step_fields.py new file mode 100644 index 0000000..8449d92 --- /dev/null +++ b/src/roe/_generated/models/edit_fields_step_fields.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="EditFieldsStepFields") + + + +@_attrs_define +class EditFieldsStepFields: + """ + """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + edit_fields_step_fields = cls( + ) + + + edit_fields_step_fields.additional_properties = d + return edit_fields_step_fields + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/for_each_block.py b/src/roe/_generated/models/for_each_block.py new file mode 100644 index 0000000..dd9a2e6 --- /dev/null +++ b/src/roe/_generated/models/for_each_block.py @@ -0,0 +1,235 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + + + + + +T = TypeVar("T", bound="ForEachBlock") + + + +@_attrs_define +class ForEachBlock: + """ + Attributes: + id (str): + kind (Literal['for_each']): Default: 'for_each'. + items (str): + steps (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | + ParallelBlock]): + item_name (str | Unset): Default: 'item'. + parallel (bool | Unset): Default: True. + """ + + id: str + items: str + steps: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] + kind: Literal['for_each'] = 'for_each' + item_name: str | Unset = 'item' + parallel: bool | Unset = True + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + id = self.id + + kind = self.kind + + items = self.items + + steps = [] + for steps_item_data in self.steps: + steps_item: dict[str, Any] + if isinstance(steps_item_data, AgentStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ConnectionStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, EditFieldsStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, MergeStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, IfBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ForEachBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ApprovalBlock): + steps_item = steps_item_data.to_dict() + else: + steps_item = steps_item_data.to_dict() + + steps.append(steps_item) + + + + item_name = self.item_name + + parallel = self.parallel + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "items": items, + "steps": steps, + }) + if item_name is not UNSET: + field_dict["item_name"] = item_name + if parallel is not UNSET: + field_dict["parallel"] = parallel + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['for_each'] , d.pop("kind")) + if kind != 'for_each': + raise ValueError(f"kind must match const 'for_each', got '{kind}'") + + items = d.pop("items") + + steps = [] + _steps = d.pop("steps") + for steps_item_data in (_steps): + def _parse_steps_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_0 = AgentStep.from_dict(data) + + + + return steps_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_1 = ConnectionStep.from_dict(data) + + + + return steps_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_2 = EditFieldsStep.from_dict(data) + + + + return steps_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_3 = MergeStep.from_dict(data) + + + + return steps_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_4 = IfBlock.from_dict(data) + + + + return steps_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_5 = ForEachBlock.from_dict(data) + + + + return steps_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_6 = ApprovalBlock.from_dict(data) + + + + return steps_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + steps_item_type_7 = ParallelBlock.from_dict(data) + + + + return steps_item_type_7 + + steps_item = _parse_steps_item(steps_item_data) + + steps.append(steps_item) + + + item_name = d.pop("item_name", UNSET) + + parallel = d.pop("parallel", UNSET) + + for_each_block = cls( + id=id, + kind=kind, + items=items, + steps=steps, + item_name=item_name, + parallel=parallel, + ) + + return for_each_block + diff --git a/src/roe/_generated/models/gate_kind.py b/src/roe/_generated/models/gate_kind.py new file mode 100644 index 0000000..b3719b3 --- /dev/null +++ b/src/roe/_generated/models/gate_kind.py @@ -0,0 +1,8 @@ +from enum import Enum + +class GateKind(str, Enum): + FEEDBACK = "feedback" + MANUAL = "manual" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/if_block.py b/src/roe/_generated/models/if_block.py new file mode 100644 index 0000000..8bc10b0 --- /dev/null +++ b/src/roe/_generated/models/if_block.py @@ -0,0 +1,380 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.combine_enum import CombineEnum +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.condition import Condition + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + + + + + +T = TypeVar("T", bound="IfBlock") + + + +@_attrs_define +class IfBlock: + """ + Attributes: + id (str): + kind (Literal['if']): Default: 'if'. + conditions (list[Condition]): + combine (CombineEnum | Unset): Default: CombineEnum.ALL. + then (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | + ParallelBlock] | Unset): + otherwise (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep + | ParallelBlock] | Unset): + """ + + id: str + conditions: list[Condition] + kind: Literal['if'] = 'if' + combine: CombineEnum | Unset = CombineEnum.ALL + then: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] | Unset = UNSET + otherwise: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.condition import Condition + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + id = self.id + + kind = self.kind + + conditions = [] + for conditions_item_data in self.conditions: + conditions_item = conditions_item_data.to_dict() + conditions.append(conditions_item) + + + + combine: str | Unset = UNSET + if not isinstance(self.combine, Unset): + combine = self.combine.value + + + then: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.then, Unset): + then = [] + for then_item_data in self.then: + then_item: dict[str, Any] + if isinstance(then_item_data, AgentStep): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, ConnectionStep): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, EditFieldsStep): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, MergeStep): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, IfBlock): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, ForEachBlock): + then_item = then_item_data.to_dict() + elif isinstance(then_item_data, ApprovalBlock): + then_item = then_item_data.to_dict() + else: + then_item = then_item_data.to_dict() + + then.append(then_item) + + + + otherwise: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.otherwise, Unset): + otherwise = [] + for otherwise_item_data in self.otherwise: + otherwise_item: dict[str, Any] + if isinstance(otherwise_item_data, AgentStep): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, ConnectionStep): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, EditFieldsStep): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, MergeStep): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, IfBlock): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, ForEachBlock): + otherwise_item = otherwise_item_data.to_dict() + elif isinstance(otherwise_item_data, ApprovalBlock): + otherwise_item = otherwise_item_data.to_dict() + else: + otherwise_item = otherwise_item_data.to_dict() + + otherwise.append(otherwise_item) + + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "conditions": conditions, + }) + if combine is not UNSET: + field_dict["combine"] = combine + if then is not UNSET: + field_dict["then"] = then + if otherwise is not UNSET: + field_dict["otherwise"] = otherwise + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.condition import Condition + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['if'] , d.pop("kind")) + if kind != 'if': + raise ValueError(f"kind must match const 'if', got '{kind}'") + + conditions = [] + _conditions = d.pop("conditions") + for conditions_item_data in (_conditions): + conditions_item = Condition.from_dict(conditions_item_data) + + + + conditions.append(conditions_item) + + + _combine = d.pop("combine", UNSET) + combine: CombineEnum | Unset + if isinstance(_combine, Unset): + combine = UNSET + else: + combine = CombineEnum(_combine) + + + + + _then = d.pop("then", UNSET) + then: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] | Unset = UNSET + if _then is not UNSET: + then = [] + for then_item_data in _then: + def _parse_then_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_0 = AgentStep.from_dict(data) + + + + return then_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_1 = ConnectionStep.from_dict(data) + + + + return then_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_2 = EditFieldsStep.from_dict(data) + + + + return then_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_3 = MergeStep.from_dict(data) + + + + return then_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_4 = IfBlock.from_dict(data) + + + + return then_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_5 = ForEachBlock.from_dict(data) + + + + return then_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + then_item_type_6 = ApprovalBlock.from_dict(data) + + + + return then_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + then_item_type_7 = ParallelBlock.from_dict(data) + + + + return then_item_type_7 + + then_item = _parse_then_item(then_item_data) + + then.append(then_item) + + + _otherwise = d.pop("otherwise", UNSET) + otherwise: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] | Unset = UNSET + if _otherwise is not UNSET: + otherwise = [] + for otherwise_item_data in _otherwise: + def _parse_otherwise_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_0 = AgentStep.from_dict(data) + + + + return otherwise_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_1 = ConnectionStep.from_dict(data) + + + + return otherwise_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_2 = EditFieldsStep.from_dict(data) + + + + return otherwise_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_3 = MergeStep.from_dict(data) + + + + return otherwise_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_4 = IfBlock.from_dict(data) + + + + return otherwise_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_5 = ForEachBlock.from_dict(data) + + + + return otherwise_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_6 = ApprovalBlock.from_dict(data) + + + + return otherwise_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + otherwise_item_type_7 = ParallelBlock.from_dict(data) + + + + return otherwise_item_type_7 + + otherwise_item = _parse_otherwise_item(otherwise_item_data) + + otherwise.append(otherwise_item) + + + if_block = cls( + id=id, + kind=kind, + conditions=conditions, + combine=combine, + then=then, + otherwise=otherwise, + ) + + return if_block + diff --git a/src/roe/_generated/models/input_field.py b/src/roe/_generated/models/input_field.py new file mode 100644 index 0000000..5467932 --- /dev/null +++ b/src/roe/_generated/models/input_field.py @@ -0,0 +1,114 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset + + + + + + +T = TypeVar("T", bound="InputField") + + + +@_attrs_define +class InputField: + """ One input a step needs or a workflow declares. + + Attributes: + key (str): + data_type (str | Unset): Default: 'text/plain'. + description (str | Unset): Default: ''. + required (bool | Unset): Default: True. + accepts_multiple_files (bool | Unset): Default: False. + """ + + key: str + data_type: str | Unset = 'text/plain' + description: str | Unset = '' + required: bool | Unset = True + accepts_multiple_files: bool | Unset = False + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + key = self.key + + data_type = self.data_type + + description = self.description + + required = self.required + + accepts_multiple_files = self.accepts_multiple_files + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "key": key, + }) + if data_type is not UNSET: + field_dict["data_type"] = data_type + if description is not UNSET: + field_dict["description"] = description + if required is not UNSET: + field_dict["required"] = required + if accepts_multiple_files is not UNSET: + field_dict["accepts_multiple_files"] = accepts_multiple_files + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + key = d.pop("key") + + data_type = d.pop("data_type", UNSET) + + description = d.pop("description", UNSET) + + required = d.pop("required", UNSET) + + accepts_multiple_files = d.pop("accepts_multiple_files", UNSET) + + input_field = cls( + key=key, + data_type=data_type, + description=description, + required=required, + accepts_multiple_files=accepts_multiple_files, + ) + + + input_field.additional_properties = d + return input_field + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/merge_step.py b/src/roe/_generated/models/merge_step.py new file mode 100644 index 0000000..ad2e6bf --- /dev/null +++ b/src/roe/_generated/models/merge_step.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.mode_enum import ModeEnum +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + + + + + + +T = TypeVar("T", bound="MergeStep") + + + +@_attrs_define +class MergeStep: + """ One value from several steps' outputs, leaving out any that didn't run, + such as the side of an If that wasn't taken. + + Attributes: + id (str): + kind (Literal['merge']): Default: 'merge'. + sources (list[str]): + mode (ModeEnum | Unset): Default: ModeEnum.APPEND. + """ + + id: str + sources: list[str] + kind: Literal['merge'] = 'merge' + mode: ModeEnum | Unset = ModeEnum.APPEND + + + + + + def to_dict(self) -> dict[str, Any]: + id = self.id + + kind = self.kind + + sources = self.sources + + + + mode: str | Unset = UNSET + if not isinstance(self.mode, Unset): + mode = self.mode.value + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "sources": sources, + }) + if mode is not UNSET: + field_dict["mode"] = mode + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['merge'] , d.pop("kind")) + if kind != 'merge': + raise ValueError(f"kind must match const 'merge', got '{kind}'") + + sources = cast(list[str], d.pop("sources")) + + + _mode = d.pop("mode", UNSET) + mode: ModeEnum | Unset + if isinstance(_mode, Unset): + mode = UNSET + else: + mode = ModeEnum(_mode) + + + + + merge_step = cls( + id=id, + kind=kind, + sources=sources, + mode=mode, + ) + + return merge_step + diff --git a/src/roe/_generated/models/mode_enum.py b/src/roe/_generated/models/mode_enum.py new file mode 100644 index 0000000..84241ef --- /dev/null +++ b/src/roe/_generated/models/mode_enum.py @@ -0,0 +1,8 @@ +from enum import Enum + +class ModeEnum(str, Enum): + APPEND = "append" + COMBINE = "combine" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/operator_enum.py b/src/roe/_generated/models/operator_enum.py new file mode 100644 index 0000000..43cef20 --- /dev/null +++ b/src/roe/_generated/models/operator_enum.py @@ -0,0 +1,15 @@ +from enum import Enum + +class OperatorEnum(str, Enum): + CONTAINS = "contains" + EQUALS = "equals" + GREATER_THAN = "greater_than" + IS_EMPTY = "is_empty" + IS_FALSE = "is_false" + IS_NOT_EMPTY = "is_not_empty" + IS_TRUE = "is_true" + LESS_THAN = "less_than" + NOT_EQUALS = "not_equals" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/paginated_workflow_list.py b/src/roe/_generated/models/paginated_workflow_list.py new file mode 100644 index 0000000..5baec84 --- /dev/null +++ b/src/roe/_generated/models/paginated_workflow_list.py @@ -0,0 +1,145 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow import Workflow + + + + + +T = TypeVar("T", bound="PaginatedWorkflowList") + + + +@_attrs_define +class PaginatedWorkflowList: + """ + Attributes: + count (int): Example: 123. + results (list[Workflow]): + next_ (None | str | Unset): Example: http://api.example.org/accounts/?page=4. + previous (None | str | Unset): Example: http://api.example.org/accounts/?page=2. + """ + + count: int + results: list[Workflow] + next_: None | str | Unset = UNSET + previous: None | str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow import Workflow + count = self.count + + results = [] + for results_item_data in self.results: + results_item = results_item_data.to_dict() + results.append(results_item) + + + + next_: None | str | Unset + if isinstance(self.next_, Unset): + next_ = UNSET + else: + next_ = self.next_ + + previous: None | str | Unset + if isinstance(self.previous, Unset): + previous = UNSET + else: + previous = self.previous + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "count": count, + "results": results, + }) + if next_ is not UNSET: + field_dict["next"] = next_ + if previous is not UNSET: + field_dict["previous"] = previous + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow import Workflow + d = dict(src_dict) + count = d.pop("count") + + results = [] + _results = d.pop("results") + for results_item_data in (_results): + results_item = Workflow.from_dict(results_item_data) + + + + results.append(results_item) + + + def _parse_next_(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + next_ = _parse_next_(d.pop("next", UNSET)) + + + def _parse_previous(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + previous = _parse_previous(d.pop("previous", UNSET)) + + + paginated_workflow_list = cls( + count=count, + results=results, + next_=next_, + previous=previous, + ) + + + paginated_workflow_list.additional_properties = d + return paginated_workflow_list + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/paginated_workflow_run_list.py b/src/roe/_generated/models/paginated_workflow_run_list.py new file mode 100644 index 0000000..fe65629 --- /dev/null +++ b/src/roe/_generated/models/paginated_workflow_run_list.py @@ -0,0 +1,145 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow_run import WorkflowRun + + + + + +T = TypeVar("T", bound="PaginatedWorkflowRunList") + + + +@_attrs_define +class PaginatedWorkflowRunList: + """ + Attributes: + count (int): Example: 123. + results (list[WorkflowRun]): + next_ (None | str | Unset): Example: http://api.example.org/accounts/?page=4. + previous (None | str | Unset): Example: http://api.example.org/accounts/?page=2. + """ + + count: int + results: list[WorkflowRun] + next_: None | str | Unset = UNSET + previous: None | str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_run import WorkflowRun + count = self.count + + results = [] + for results_item_data in self.results: + results_item = results_item_data.to_dict() + results.append(results_item) + + + + next_: None | str | Unset + if isinstance(self.next_, Unset): + next_ = UNSET + else: + next_ = self.next_ + + previous: None | str | Unset + if isinstance(self.previous, Unset): + previous = UNSET + else: + previous = self.previous + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "count": count, + "results": results, + }) + if next_ is not UNSET: + field_dict["next"] = next_ + if previous is not UNSET: + field_dict["previous"] = previous + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_run import WorkflowRun + d = dict(src_dict) + count = d.pop("count") + + results = [] + _results = d.pop("results") + for results_item_data in (_results): + results_item = WorkflowRun.from_dict(results_item_data) + + + + results.append(results_item) + + + def _parse_next_(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + next_ = _parse_next_(d.pop("next", UNSET)) + + + def _parse_previous(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + previous = _parse_previous(d.pop("previous", UNSET)) + + + paginated_workflow_run_list = cls( + count=count, + results=results, + next_=next_, + previous=previous, + ) + + + paginated_workflow_run_list.additional_properties = d + return paginated_workflow_run_list + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/paginated_workflow_version_list.py b/src/roe/_generated/models/paginated_workflow_version_list.py new file mode 100644 index 0000000..8b7cb50 --- /dev/null +++ b/src/roe/_generated/models/paginated_workflow_version_list.py @@ -0,0 +1,145 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow_version import WorkflowVersion + + + + + +T = TypeVar("T", bound="PaginatedWorkflowVersionList") + + + +@_attrs_define +class PaginatedWorkflowVersionList: + """ + Attributes: + count (int): Example: 123. + results (list[WorkflowVersion]): + next_ (None | str | Unset): Example: http://api.example.org/accounts/?page=4. + previous (None | str | Unset): Example: http://api.example.org/accounts/?page=2. + """ + + count: int + results: list[WorkflowVersion] + next_: None | str | Unset = UNSET + previous: None | str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_version import WorkflowVersion + count = self.count + + results = [] + for results_item_data in self.results: + results_item = results_item_data.to_dict() + results.append(results_item) + + + + next_: None | str | Unset + if isinstance(self.next_, Unset): + next_ = UNSET + else: + next_ = self.next_ + + previous: None | str | Unset + if isinstance(self.previous, Unset): + previous = UNSET + else: + previous = self.previous + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "count": count, + "results": results, + }) + if next_ is not UNSET: + field_dict["next"] = next_ + if previous is not UNSET: + field_dict["previous"] = previous + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_version import WorkflowVersion + d = dict(src_dict) + count = d.pop("count") + + results = [] + _results = d.pop("results") + for results_item_data in (_results): + results_item = WorkflowVersion.from_dict(results_item_data) + + + + results.append(results_item) + + + def _parse_next_(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + next_ = _parse_next_(d.pop("next", UNSET)) + + + def _parse_previous(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + previous = _parse_previous(d.pop("previous", UNSET)) + + + paginated_workflow_version_list = cls( + count=count, + results=results, + next_=next_, + previous=previous, + ) + + + paginated_workflow_version_list.additional_properties = d + return paginated_workflow_version_list + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/parallel_block.py b/src/roe/_generated/models/parallel_block.py new file mode 100644 index 0000000..acb4675 --- /dev/null +++ b/src/roe/_generated/models/parallel_block.py @@ -0,0 +1,218 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + + + + + +T = TypeVar("T", bound="ParallelBlock") + + + +@_attrs_define +class ParallelBlock: + """ + Attributes: + id (str): + kind (Literal['parallel']): Default: 'parallel'. + lanes (list[list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | + MergeStep | ParallelBlock]]): + """ + + id: str + lanes: list[list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock]] + kind: Literal['parallel'] = 'parallel' + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + id = self.id + + kind = self.kind + + lanes = [] + for lanes_item_data in self.lanes: + lanes_item = [] + for lanes_item_item_data in lanes_item_data: + lanes_item_item: dict[str, Any] + if isinstance(lanes_item_item_data, AgentStep): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, ConnectionStep): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, EditFieldsStep): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, MergeStep): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, IfBlock): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, ForEachBlock): + lanes_item_item = lanes_item_item_data.to_dict() + elif isinstance(lanes_item_item_data, ApprovalBlock): + lanes_item_item = lanes_item_item_data.to_dict() + else: + lanes_item_item = lanes_item_item_data.to_dict() + + lanes_item.append(lanes_item_item) + + + lanes.append(lanes_item) + + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "kind": kind, + "lanes": lanes, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.merge_step import MergeStep + d = dict(src_dict) + id = d.pop("id") + + kind = cast(Literal['parallel'] , d.pop("kind")) + if kind != 'parallel': + raise ValueError(f"kind must match const 'parallel', got '{kind}'") + + lanes = [] + _lanes = d.pop("lanes") + for lanes_item_data in (_lanes): + lanes_item = [] + _lanes_item = lanes_item_data + for lanes_item_item_data in (_lanes_item): + def _parse_lanes_item_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_0 = AgentStep.from_dict(data) + + + + return lanes_item_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_1 = ConnectionStep.from_dict(data) + + + + return lanes_item_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_2 = EditFieldsStep.from_dict(data) + + + + return lanes_item_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_3 = MergeStep.from_dict(data) + + + + return lanes_item_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_4 = IfBlock.from_dict(data) + + + + return lanes_item_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_5 = ForEachBlock.from_dict(data) + + + + return lanes_item_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_6 = ApprovalBlock.from_dict(data) + + + + return lanes_item_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + lanes_item_item_type_7 = ParallelBlock.from_dict(data) + + + + return lanes_item_item_type_7 + + lanes_item_item = _parse_lanes_item_item(lanes_item_item_data) + + lanes_item.append(lanes_item_item) + + lanes.append(lanes_item) + + + parallel_block = cls( + id=id, + kind=kind, + lanes=lanes, + ) + + return parallel_block + diff --git a/src/roe/_generated/models/patched_workflow_update_request.py b/src/roe/_generated/models/patched_workflow_update_request.py new file mode 100644 index 0000000..47be310 --- /dev/null +++ b/src/roe/_generated/models/patched_workflow_update_request.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset + + + + + + +T = TypeVar("T", bound="PatchedWorkflowUpdateRequest") + + + +@_attrs_define +class PatchedWorkflowUpdateRequest: + """ + Attributes: + name (str | Unset): + """ + + name: str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + name = self.name + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + }) + if name is not UNSET: + field_dict["name"] = name + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + name = d.pop("name", UNSET) + + patched_workflow_update_request = cls( + name=name, + ) + + + patched_workflow_update_request.additional_properties = d + return patched_workflow_update_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/step_run.py b/src/roe/_generated/models/step_run.py new file mode 100644 index 0000000..8ea25ec --- /dev/null +++ b/src/roe/_generated/models/step_run.py @@ -0,0 +1,309 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.step_run_delivery_enum import StepRunDeliveryEnum +from ..models.step_run_status_enum import StepRunStatusEnum +from ..types import UNSET, Unset +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="StepRun") + + + +@_attrs_define +class StepRun: + """ + Attributes: + step_id (str): + execution_path (Any): + status (StepRunStatusEnum): * `succeeded` - succeeded + * `failed` - failed + * `skipped` - skipped + * `cancelled` - cancelled + child_job_id (None | UUID): + cached (bool | Unset): + input_ (Any | None | Unset): + output (Any | None | Unset): + error (None | str | Unset): + delivery (None | StepRunDeliveryEnum | Unset): For a step that sends: sending, sent, or unknown when Roe + couldn't tell whether the send went through. + + * `sending` - Sending + * `sent` - Sent + * `unknown` - Unknown + started_at (datetime.datetime | None | Unset): + finished_at (datetime.datetime | None | Unset): + """ + + step_id: str + execution_path: Any + status: StepRunStatusEnum + child_job_id: None | UUID + cached: bool | Unset = UNSET + input_: Any | None | Unset = UNSET + output: Any | None | Unset = UNSET + error: None | str | Unset = UNSET + delivery: None | StepRunDeliveryEnum | Unset = UNSET + started_at: datetime.datetime | None | Unset = UNSET + finished_at: datetime.datetime | None | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + step_id = self.step_id + + execution_path = self.execution_path + + status = self.status.value + + child_job_id: None | str + if isinstance(self.child_job_id, UUID): + child_job_id = str(self.child_job_id) + else: + child_job_id = self.child_job_id + + cached = self.cached + + input_: Any | None | Unset + if isinstance(self.input_, Unset): + input_ = UNSET + else: + input_ = self.input_ + + output: Any | None | Unset + if isinstance(self.output, Unset): + output = UNSET + else: + output = self.output + + error: None | str | Unset + if isinstance(self.error, Unset): + error = UNSET + else: + error = self.error + + delivery: None | str | Unset + if isinstance(self.delivery, Unset): + delivery = UNSET + elif isinstance(self.delivery, StepRunDeliveryEnum): + delivery = self.delivery.value + else: + delivery = self.delivery + + started_at: None | str | Unset + if isinstance(self.started_at, Unset): + started_at = UNSET + elif isinstance(self.started_at, datetime.datetime): + started_at = self.started_at.isoformat() + else: + started_at = self.started_at + + finished_at: None | str | Unset + if isinstance(self.finished_at, Unset): + finished_at = UNSET + elif isinstance(self.finished_at, datetime.datetime): + finished_at = self.finished_at.isoformat() + else: + finished_at = self.finished_at + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "step_id": step_id, + "execution_path": execution_path, + "status": status, + "child_job_id": child_job_id, + }) + if cached is not UNSET: + field_dict["cached"] = cached + if input_ is not UNSET: + field_dict["input"] = input_ + if output is not UNSET: + field_dict["output"] = output + if error is not UNSET: + field_dict["error"] = error + if delivery is not UNSET: + field_dict["delivery"] = delivery + if started_at is not UNSET: + field_dict["started_at"] = started_at + if finished_at is not UNSET: + field_dict["finished_at"] = finished_at + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + step_id = d.pop("step_id") + + execution_path = d.pop("execution_path") + + status = StepRunStatusEnum(d.pop("status")) + + + + + def _parse_child_job_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + child_job_id_type_0 = UUID(data) + + + + return child_job_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + child_job_id = _parse_child_job_id(d.pop("child_job_id")) + + + cached = d.pop("cached", UNSET) + + def _parse_input_(data: object) -> Any | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(Any | None | Unset, data) + + input_ = _parse_input_(d.pop("input", UNSET)) + + + def _parse_output(data: object) -> Any | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(Any | None | Unset, data) + + output = _parse_output(d.pop("output", UNSET)) + + + def _parse_error(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + error = _parse_error(d.pop("error", UNSET)) + + + def _parse_delivery(data: object) -> None | StepRunDeliveryEnum | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + delivery_type_0 = StepRunDeliveryEnum(data) + + + + return delivery_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | StepRunDeliveryEnum | Unset, data) + + delivery = _parse_delivery(d.pop("delivery", UNSET)) + + + def _parse_started_at(data: object) -> datetime.datetime | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + started_at_type_0 = isoparse(data) + + + + return started_at_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(datetime.datetime | None | Unset, data) + + started_at = _parse_started_at(d.pop("started_at", UNSET)) + + + def _parse_finished_at(data: object) -> datetime.datetime | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + finished_at_type_0 = isoparse(data) + + + + return finished_at_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(datetime.datetime | None | Unset, data) + + finished_at = _parse_finished_at(d.pop("finished_at", UNSET)) + + + step_run = cls( + step_id=step_id, + execution_path=execution_path, + status=status, + child_job_id=child_job_id, + cached=cached, + input_=input_, + output=output, + error=error, + delivery=delivery, + started_at=started_at, + finished_at=finished_at, + ) + + + step_run.additional_properties = d + return step_run + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/step_run_delivery_enum.py b/src/roe/_generated/models/step_run_delivery_enum.py new file mode 100644 index 0000000..923daee --- /dev/null +++ b/src/roe/_generated/models/step_run_delivery_enum.py @@ -0,0 +1,9 @@ +from enum import Enum + +class StepRunDeliveryEnum(str, Enum): + SENDING = "sending" + SENT = "sent" + UNKNOWN = "unknown" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/step_run_status_enum.py b/src/roe/_generated/models/step_run_status_enum.py new file mode 100644 index 0000000..f62c274 --- /dev/null +++ b/src/roe/_generated/models/step_run_status_enum.py @@ -0,0 +1,10 @@ +from enum import Enum + +class StepRunStatusEnum(str, Enum): + CANCELLED = "cancelled" + FAILED = "failed" + SKIPPED = "skipped" + SUCCEEDED = "succeeded" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/workflow.py b/src/roe/_generated/models/workflow.py new file mode 100644 index 0000000..575714e --- /dev/null +++ b/src/roe/_generated/models/workflow.py @@ -0,0 +1,194 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.user_info import UserInfo + + + + + +T = TypeVar("T", bound="Workflow") + + + +@_attrs_define +class Workflow: + """ + Attributes: + id (UUID): + name (str): + agent_id (UUID): The workflow's id as an agent. Calling a workflow by it is deprecated; the agent_id filter + finds the workflow it belongs to. + current_version_id (None | UUID): + creator (None | UserInfo): + updated_at (datetime.datetime): + created_at (datetime.datetime | Unset): + """ + + id: UUID + name: str + agent_id: UUID + current_version_id: None | UUID + creator: None | UserInfo + updated_at: datetime.datetime + created_at: datetime.datetime | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.user_info import UserInfo + id = str(self.id) + + name = self.name + + agent_id = str(self.agent_id) + + current_version_id: None | str + if isinstance(self.current_version_id, UUID): + current_version_id = str(self.current_version_id) + else: + current_version_id = self.current_version_id + + creator: dict[str, Any] | None + if isinstance(self.creator, UserInfo): + creator = self.creator.to_dict() + else: + creator = self.creator + + updated_at = self.updated_at.isoformat() + + created_at: str | Unset = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "name": name, + "agent_id": agent_id, + "current_version_id": current_version_id, + "creator": creator, + "updated_at": updated_at, + }) + if created_at is not UNSET: + field_dict["created_at"] = created_at + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.user_info import UserInfo + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + name = d.pop("name") + + agent_id = UUID(d.pop("agent_id")) + + + + + def _parse_current_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + current_version_id_type_0 = UUID(data) + + + + return current_version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + current_version_id = _parse_current_version_id(d.pop("current_version_id")) + + + def _parse_creator(data: object) -> None | UserInfo: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + creator_type_0 = UserInfo.from_dict(data) + + + + return creator_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UserInfo, data) + + creator = _parse_creator(d.pop("creator")) + + + updated_at = isoparse(d.pop("updated_at")) + + + + + _created_at = d.pop("created_at", UNSET) + created_at: datetime.datetime | Unset + if isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) + + + + + workflow = cls( + id=id, + name=name, + agent_id=agent_id, + current_version_id=current_version_id, + creator=creator, + updated_at=updated_at, + created_at=created_at, + ) + + + workflow.additional_properties = d + return workflow + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_create_request.py b/src/roe/_generated/models/workflow_create_request.py new file mode 100644 index 0000000..d1b228a --- /dev/null +++ b/src/roe/_generated/models/workflow_create_request.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + + + + + +T = TypeVar("T", bound="WorkflowCreateRequest") + + + +@_attrs_define +class WorkflowCreateRequest: + """ + Attributes: + name (str): + definition (WorkflowDefinitionRequest): + version_name (str | Unset): + description (str | Unset): + """ + + name: str + definition: WorkflowDefinitionRequest + version_name: str | Unset = UNSET + description: str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + name = self.name + + definition = self.definition.to_dict() + + version_name = self.version_name + + description = self.description + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "name": name, + "definition": definition, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if description is not UNSET: + field_dict["description"] = description + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + d = dict(src_dict) + name = d.pop("name") + + definition = WorkflowDefinitionRequest.from_dict(d.pop("definition")) + + + + + version_name = d.pop("version_name", UNSET) + + description = d.pop("description", UNSET) + + workflow_create_request = cls( + name=name, + definition=definition, + version_name=version_name, + description=description, + ) + + + workflow_create_request.additional_properties = d + return workflow_create_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_definition.py b/src/roe/_generated/models/workflow_definition.py new file mode 100644 index 0000000..2e16651 --- /dev/null +++ b/src/roe/_generated/models/workflow_definition.py @@ -0,0 +1,242 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + + + + + +T = TypeVar("T", bound="WorkflowDefinition") + + + +@_attrs_define +class WorkflowDefinition: + """ + Attributes: + steps (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | + ParallelBlock]): + result (str): + format_version (Literal[2] | Unset): Default: 2. + inputs (list[InputField] | Unset): + """ + + steps: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] + result: str + format_version: Literal[2] | Unset = 2 + inputs: list[InputField] | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + steps = [] + for steps_item_data in self.steps: + steps_item: dict[str, Any] + if isinstance(steps_item_data, AgentStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ConnectionStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, EditFieldsStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, MergeStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, IfBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ForEachBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ApprovalBlock): + steps_item = steps_item_data.to_dict() + else: + steps_item = steps_item_data.to_dict() + + steps.append(steps_item) + + + + result = self.result + + format_version = self.format_version + + inputs: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.inputs, Unset): + inputs = [] + for inputs_item_data in self.inputs: + inputs_item = inputs_item_data.to_dict() + inputs.append(inputs_item) + + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "steps": steps, + "result": result, + }) + if format_version is not UNSET: + field_dict["format_version"] = format_version + if inputs is not UNSET: + field_dict["inputs"] = inputs + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + d = dict(src_dict) + steps = [] + _steps = d.pop("steps") + for steps_item_data in (_steps): + def _parse_steps_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_0 = AgentStep.from_dict(data) + + + + return steps_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_1 = ConnectionStep.from_dict(data) + + + + return steps_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_2 = EditFieldsStep.from_dict(data) + + + + return steps_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_3 = MergeStep.from_dict(data) + + + + return steps_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_4 = IfBlock.from_dict(data) + + + + return steps_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_5 = ForEachBlock.from_dict(data) + + + + return steps_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_6 = ApprovalBlock.from_dict(data) + + + + return steps_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + steps_item_type_7 = ParallelBlock.from_dict(data) + + + + return steps_item_type_7 + + steps_item = _parse_steps_item(steps_item_data) + + steps.append(steps_item) + + + result = d.pop("result") + + format_version = cast(Literal[2] | Unset , d.pop("format_version", UNSET)) + if format_version != 2and not isinstance(format_version, Unset): + raise ValueError(f"format_version must match const 2, got '{format_version}'") + + _inputs = d.pop("inputs", UNSET) + inputs: list[InputField] | Unset = UNSET + if _inputs is not UNSET: + inputs = [] + for inputs_item_data in _inputs: + inputs_item = InputField.from_dict(inputs_item_data) + + + + inputs.append(inputs_item) + + + workflow_definition = cls( + steps=steps, + result=result, + format_version=format_version, + inputs=inputs, + ) + + return workflow_definition + diff --git a/src/roe/_generated/models/workflow_definition_request.py b/src/roe/_generated/models/workflow_definition_request.py new file mode 100644 index 0000000..0e7610e --- /dev/null +++ b/src/roe/_generated/models/workflow_definition_request.py @@ -0,0 +1,242 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + + + + + +T = TypeVar("T", bound="WorkflowDefinitionRequest") + + + +@_attrs_define +class WorkflowDefinitionRequest: + """ + Attributes: + steps (list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | + ParallelBlock]): + result (str): + format_version (Literal[2] | Unset): Default: 2. + inputs (list[InputField] | Unset): + """ + + steps: list[AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock] + result: str + format_version: Literal[2] | Unset = 2 + inputs: list[InputField] | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + steps = [] + for steps_item_data in self.steps: + steps_item: dict[str, Any] + if isinstance(steps_item_data, AgentStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ConnectionStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, EditFieldsStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, MergeStep): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, IfBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ForEachBlock): + steps_item = steps_item_data.to_dict() + elif isinstance(steps_item_data, ApprovalBlock): + steps_item = steps_item_data.to_dict() + else: + steps_item = steps_item_data.to_dict() + + steps.append(steps_item) + + + + result = self.result + + format_version = self.format_version + + inputs: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.inputs, Unset): + inputs = [] + for inputs_item_data in self.inputs: + inputs_item = inputs_item_data.to_dict() + inputs.append(inputs_item) + + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "steps": steps, + "result": result, + }) + if format_version is not UNSET: + field_dict["format_version"] = format_version + if inputs is not UNSET: + field_dict["inputs"] = inputs + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.agent_step import AgentStep + from ..models.approval_block import ApprovalBlock + from ..models.connection_step import ConnectionStep + from ..models.edit_fields_step import EditFieldsStep + from ..models.for_each_block import ForEachBlock + from ..models.if_block import IfBlock + from ..models.input_field import InputField + from ..models.merge_step import MergeStep + from ..models.parallel_block import ParallelBlock + d = dict(src_dict) + steps = [] + _steps = d.pop("steps") + for steps_item_data in (_steps): + def _parse_steps_item(data: object) -> AgentStep | ApprovalBlock | ConnectionStep | EditFieldsStep | ForEachBlock | IfBlock | MergeStep | ParallelBlock: + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_0 = AgentStep.from_dict(data) + + + + return steps_item_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_1 = ConnectionStep.from_dict(data) + + + + return steps_item_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_2 = EditFieldsStep.from_dict(data) + + + + return steps_item_type_2 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_3 = MergeStep.from_dict(data) + + + + return steps_item_type_3 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_4 = IfBlock.from_dict(data) + + + + return steps_item_type_4 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_5 = ForEachBlock.from_dict(data) + + + + return steps_item_type_5 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, dict): + raise TypeError() + steps_item_type_6 = ApprovalBlock.from_dict(data) + + + + return steps_item_type_6 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + steps_item_type_7 = ParallelBlock.from_dict(data) + + + + return steps_item_type_7 + + steps_item = _parse_steps_item(steps_item_data) + + steps.append(steps_item) + + + result = d.pop("result") + + format_version = cast(Literal[2] | Unset , d.pop("format_version", UNSET)) + if format_version != 2and not isinstance(format_version, Unset): + raise ValueError(f"format_version must match const 2, got '{format_version}'") + + _inputs = d.pop("inputs", UNSET) + inputs: list[InputField] | Unset = UNSET + if _inputs is not UNSET: + inputs = [] + for inputs_item_data in _inputs: + inputs_item = InputField.from_dict(inputs_item_data) + + + + inputs.append(inputs_item) + + + workflow_definition_request = cls( + steps=steps, + result=result, + format_version=format_version, + inputs=inputs, + ) + + return workflow_definition_request + diff --git a/src/roe/_generated/models/workflow_detail.py b/src/roe/_generated/models/workflow_detail.py new file mode 100644 index 0000000..ce01fd8 --- /dev/null +++ b/src/roe/_generated/models/workflow_detail.py @@ -0,0 +1,225 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.user_info import UserInfo + from ..models.workflow_version_detail import WorkflowVersionDetail + + + + + +T = TypeVar("T", bound="WorkflowDetail") + + + +@_attrs_define +class WorkflowDetail: + """ + Attributes: + id (UUID): + name (str): + agent_id (UUID): The workflow's id as an agent. Calling a workflow by it is deprecated; the agent_id filter + finds the workflow it belongs to. + current_version_id (None | UUID): + creator (None | UserInfo): + updated_at (datetime.datetime): + current_version (None | WorkflowVersionDetail): + created_at (datetime.datetime | Unset): + """ + + id: UUID + name: str + agent_id: UUID + current_version_id: None | UUID + creator: None | UserInfo + updated_at: datetime.datetime + current_version: None | WorkflowVersionDetail + created_at: datetime.datetime | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.user_info import UserInfo + from ..models.workflow_version_detail import WorkflowVersionDetail + id = str(self.id) + + name = self.name + + agent_id = str(self.agent_id) + + current_version_id: None | str + if isinstance(self.current_version_id, UUID): + current_version_id = str(self.current_version_id) + else: + current_version_id = self.current_version_id + + creator: dict[str, Any] | None + if isinstance(self.creator, UserInfo): + creator = self.creator.to_dict() + else: + creator = self.creator + + updated_at = self.updated_at.isoformat() + + current_version: dict[str, Any] | None + if isinstance(self.current_version, WorkflowVersionDetail): + current_version = self.current_version.to_dict() + else: + current_version = self.current_version + + created_at: str | Unset = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "name": name, + "agent_id": agent_id, + "current_version_id": current_version_id, + "creator": creator, + "updated_at": updated_at, + "current_version": current_version, + }) + if created_at is not UNSET: + field_dict["created_at"] = created_at + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.user_info import UserInfo + from ..models.workflow_version_detail import WorkflowVersionDetail + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + name = d.pop("name") + + agent_id = UUID(d.pop("agent_id")) + + + + + def _parse_current_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + current_version_id_type_0 = UUID(data) + + + + return current_version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + current_version_id = _parse_current_version_id(d.pop("current_version_id")) + + + def _parse_creator(data: object) -> None | UserInfo: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + creator_type_0 = UserInfo.from_dict(data) + + + + return creator_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UserInfo, data) + + creator = _parse_creator(d.pop("creator")) + + + updated_at = isoparse(d.pop("updated_at")) + + + + + def _parse_current_version(data: object) -> None | WorkflowVersionDetail: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + current_version_type_0 = WorkflowVersionDetail.from_dict(data) + + + + return current_version_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | WorkflowVersionDetail, data) + + current_version = _parse_current_version(d.pop("current_version")) + + + _created_at = d.pop("created_at", UNSET) + created_at: datetime.datetime | Unset + if isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) + + + + + workflow_detail = cls( + id=id, + name=name, + agent_id=agent_id, + current_version_id=current_version_id, + creator=creator, + updated_at=updated_at, + current_version=current_version, + created_at=created_at, + ) + + + workflow_detail.additional_properties = d + return workflow_detail + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run.py b/src/roe/_generated/models/workflow_run.py new file mode 100644 index 0000000..5f4f5e2 --- /dev/null +++ b/src/roe/_generated/models/workflow_run.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.workflow_run_status_enum import WorkflowRunStatusEnum +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="WorkflowRun") + + + +@_attrs_define +class WorkflowRun: + """ + Attributes: + id (UUID): + workflow_id (UUID): + version_id (None | UUID): + status (WorkflowRunStatusEnum): * `pending` - pending + * `running` - running + * `succeeded` - succeeded + * `failed` - failed + * `cancelled` - cancelled + error_message (None | str): + created_at (datetime.datetime): + """ + + id: UUID + workflow_id: UUID + version_id: None | UUID + status: WorkflowRunStatusEnum + error_message: None | str + created_at: datetime.datetime + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = str(self.id) + + workflow_id = str(self.workflow_id) + + version_id: None | str + if isinstance(self.version_id, UUID): + version_id = str(self.version_id) + else: + version_id = self.version_id + + status = self.status.value + + error_message: None | str + error_message = self.error_message + + created_at = self.created_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "workflow_id": workflow_id, + "version_id": version_id, + "status": status, + "error_message": error_message, + "created_at": created_at, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + workflow_id = UUID(d.pop("workflow_id")) + + + + + def _parse_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + version_id_type_0 = UUID(data) + + + + return version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + version_id = _parse_version_id(d.pop("version_id")) + + + status = WorkflowRunStatusEnum(d.pop("status")) + + + + + def _parse_error_message(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + error_message = _parse_error_message(d.pop("error_message")) + + + created_at = isoparse(d.pop("created_at")) + + + + + workflow_run = cls( + id=id, + workflow_id=workflow_id, + version_id=version_id, + status=status, + error_message=error_message, + created_at=created_at, + ) + + + workflow_run.additional_properties = d + return workflow_run + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_batch.py b/src/roe/_generated/models/workflow_run_batch.py new file mode 100644 index 0000000..18c61d4 --- /dev/null +++ b/src/roe/_generated/models/workflow_run_batch.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow_run import WorkflowRun + + + + + +T = TypeVar("T", bound="WorkflowRunBatch") + + + +@_attrs_define +class WorkflowRunBatch: + """ + Attributes: + runs (list[WorkflowRun]): + """ + + runs: list[WorkflowRun] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_run import WorkflowRun + runs = [] + for runs_item_data in self.runs: + runs_item = runs_item_data.to_dict() + runs.append(runs_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "runs": runs, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_run import WorkflowRun + d = dict(src_dict) + runs = [] + _runs = d.pop("runs") + for runs_item_data in (_runs): + runs_item = WorkflowRun.from_dict(runs_item_data) + + + + runs.append(runs_item) + + + workflow_run_batch = cls( + runs=runs, + ) + + + workflow_run_batch.additional_properties = d + return workflow_run_batch + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_batch_create_request.py b/src/roe/_generated/models/workflow_run_batch_create_request.py new file mode 100644 index 0000000..d3b9ed3 --- /dev/null +++ b/src/roe/_generated/models/workflow_run_batch_create_request.py @@ -0,0 +1,115 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from uuid import UUID + +if TYPE_CHECKING: + from ..models.workflow_run_batch_create_request_inputs_item import WorkflowRunBatchCreateRequestInputsItem + + + + + +T = TypeVar("T", bound="WorkflowRunBatchCreateRequest") + + + +@_attrs_define +class WorkflowRunBatchCreateRequest: + """ + Attributes: + inputs (list[WorkflowRunBatchCreateRequestInputsItem]): One object of input values per run. + version_id (UUID | Unset): The version to run. Defaults to the current one. + """ + + inputs: list[WorkflowRunBatchCreateRequestInputsItem] + version_id: UUID | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_run_batch_create_request_inputs_item import WorkflowRunBatchCreateRequestInputsItem + inputs = [] + for inputs_item_data in self.inputs: + inputs_item = inputs_item_data.to_dict() + inputs.append(inputs_item) + + + + version_id: str | Unset = UNSET + if not isinstance(self.version_id, Unset): + version_id = str(self.version_id) + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "inputs": inputs, + }) + if version_id is not UNSET: + field_dict["version_id"] = version_id + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_run_batch_create_request_inputs_item import WorkflowRunBatchCreateRequestInputsItem + d = dict(src_dict) + inputs = [] + _inputs = d.pop("inputs") + for inputs_item_data in (_inputs): + inputs_item = WorkflowRunBatchCreateRequestInputsItem.from_dict(inputs_item_data) + + + + inputs.append(inputs_item) + + + _version_id = d.pop("version_id", UNSET) + version_id: UUID | Unset + if isinstance(_version_id, Unset): + version_id = UNSET + else: + version_id = UUID(_version_id) + + + + + workflow_run_batch_create_request = cls( + inputs=inputs, + version_id=version_id, + ) + + + workflow_run_batch_create_request.additional_properties = d + return workflow_run_batch_create_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_batch_create_request_inputs_item.py b/src/roe/_generated/models/workflow_run_batch_create_request_inputs_item.py new file mode 100644 index 0000000..38e0bed --- /dev/null +++ b/src/roe/_generated/models/workflow_run_batch_create_request_inputs_item.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="WorkflowRunBatchCreateRequestInputsItem") + + + +@_attrs_define +class WorkflowRunBatchCreateRequestInputsItem: + """ + """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflow_run_batch_create_request_inputs_item = cls( + ) + + + workflow_run_batch_create_request_inputs_item.additional_properties = d + return workflow_run_batch_create_request_inputs_item + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_create_request.py b/src/roe/_generated/models/workflow_run_create_request.py new file mode 100644 index 0000000..4854938 --- /dev/null +++ b/src/roe/_generated/models/workflow_run_create_request.py @@ -0,0 +1,145 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast +from uuid import UUID + +if TYPE_CHECKING: + from ..models.workflow_run_create_request_inputs import WorkflowRunCreateRequestInputs + from ..models.workflow_run_create_request_metadata import WorkflowRunCreateRequestMetadata + + + + + +T = TypeVar("T", bound="WorkflowRunCreateRequest") + + + +@_attrs_define +class WorkflowRunCreateRequest: + """ + Attributes: + inputs (WorkflowRunCreateRequestInputs | Unset): Values for the workflow's inputs, keyed by input. A file input + takes a file id or URL, or the file itself in a multipart request. + version_id (UUID | Unset): The version to run. Defaults to the current one. + metadata (WorkflowRunCreateRequestMetadata | Unset): + wait (bool | Unset): Wait up to 60 seconds for the run to finish, then return it as it stands. Default: False. + """ + + inputs: WorkflowRunCreateRequestInputs | Unset = UNSET + version_id: UUID | Unset = UNSET + metadata: WorkflowRunCreateRequestMetadata | Unset = UNSET + wait: bool | Unset = False + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_run_create_request_inputs import WorkflowRunCreateRequestInputs + from ..models.workflow_run_create_request_metadata import WorkflowRunCreateRequestMetadata + inputs: dict[str, Any] | Unset = UNSET + if not isinstance(self.inputs, Unset): + inputs = self.inputs.to_dict() + + version_id: str | Unset = UNSET + if not isinstance(self.version_id, Unset): + version_id = str(self.version_id) + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + wait = self.wait + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + }) + if inputs is not UNSET: + field_dict["inputs"] = inputs + if version_id is not UNSET: + field_dict["version_id"] = version_id + if metadata is not UNSET: + field_dict["metadata"] = metadata + if wait is not UNSET: + field_dict["wait"] = wait + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_run_create_request_inputs import WorkflowRunCreateRequestInputs + from ..models.workflow_run_create_request_metadata import WorkflowRunCreateRequestMetadata + d = dict(src_dict) + _inputs = d.pop("inputs", UNSET) + inputs: WorkflowRunCreateRequestInputs | Unset + if isinstance(_inputs, Unset): + inputs = UNSET + else: + inputs = WorkflowRunCreateRequestInputs.from_dict(_inputs) + + + + + _version_id = d.pop("version_id", UNSET) + version_id: UUID | Unset + if isinstance(_version_id, Unset): + version_id = UNSET + else: + version_id = UUID(_version_id) + + + + + _metadata = d.pop("metadata", UNSET) + metadata: WorkflowRunCreateRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = WorkflowRunCreateRequestMetadata.from_dict(_metadata) + + + + + wait = d.pop("wait", UNSET) + + workflow_run_create_request = cls( + inputs=inputs, + version_id=version_id, + metadata=metadata, + wait=wait, + ) + + + workflow_run_create_request.additional_properties = d + return workflow_run_create_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_create_request_inputs.py b/src/roe/_generated/models/workflow_run_create_request_inputs.py new file mode 100644 index 0000000..718224b --- /dev/null +++ b/src/roe/_generated/models/workflow_run_create_request_inputs.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="WorkflowRunCreateRequestInputs") + + + +@_attrs_define +class WorkflowRunCreateRequestInputs: + """ Values for the workflow's inputs, keyed by input. A file input takes a file id or URL, or the file itself in a + multipart request. + + """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflow_run_create_request_inputs = cls( + ) + + + workflow_run_create_request_inputs.additional_properties = d + return workflow_run_create_request_inputs + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_create_request_metadata.py b/src/roe/_generated/models/workflow_run_create_request_metadata.py new file mode 100644 index 0000000..e7168d1 --- /dev/null +++ b/src/roe/_generated/models/workflow_run_create_request_metadata.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="WorkflowRunCreateRequestMetadata") + + + +@_attrs_define +class WorkflowRunCreateRequestMetadata: + """ + """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflow_run_create_request_metadata = cls( + ) + + + workflow_run_create_request_metadata.additional_properties = d + return workflow_run_create_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_detail.py b/src/roe/_generated/models/workflow_run_detail.py new file mode 100644 index 0000000..daf727c --- /dev/null +++ b/src/roe/_generated/models/workflow_run_detail.py @@ -0,0 +1,225 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.workflow_run_status_enum import WorkflowRunStatusEnum +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.step_run import StepRun + + + + + +T = TypeVar("T", bound="WorkflowRunDetail") + + + +@_attrs_define +class WorkflowRunDetail: + """ + Attributes: + id (UUID): + workflow_id (UUID): + version_id (None | UUID): + status (WorkflowRunStatusEnum): * `pending` - pending + * `running` - running + * `succeeded` - succeeded + * `failed` - failed + * `cancelled` - cancelled + error_message (None | str): + created_at (datetime.datetime): + inputs (Any): + outputs (list[Any] | None): The result step's output, once the run has finished. + steps (list[StepRun]): + """ + + id: UUID + workflow_id: UUID + version_id: None | UUID + status: WorkflowRunStatusEnum + error_message: None | str + created_at: datetime.datetime + inputs: Any + outputs: list[Any] | None + steps: list[StepRun] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.step_run import StepRun + id = str(self.id) + + workflow_id = str(self.workflow_id) + + version_id: None | str + if isinstance(self.version_id, UUID): + version_id = str(self.version_id) + else: + version_id = self.version_id + + status = self.status.value + + error_message: None | str + error_message = self.error_message + + created_at = self.created_at.isoformat() + + inputs = self.inputs + + outputs: list[Any] | None + if isinstance(self.outputs, list): + outputs = self.outputs + + + else: + outputs = self.outputs + + steps = [] + for steps_item_data in self.steps: + steps_item = steps_item_data.to_dict() + steps.append(steps_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "workflow_id": workflow_id, + "version_id": version_id, + "status": status, + "error_message": error_message, + "created_at": created_at, + "inputs": inputs, + "outputs": outputs, + "steps": steps, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.step_run import StepRun + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + workflow_id = UUID(d.pop("workflow_id")) + + + + + def _parse_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + version_id_type_0 = UUID(data) + + + + return version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + version_id = _parse_version_id(d.pop("version_id")) + + + status = WorkflowRunStatusEnum(d.pop("status")) + + + + + def _parse_error_message(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + error_message = _parse_error_message(d.pop("error_message")) + + + created_at = isoparse(d.pop("created_at")) + + + + + inputs = d.pop("inputs") + + def _parse_outputs(data: object) -> list[Any] | None: + if data is None: + return data + try: + if not isinstance(data, list): + raise TypeError() + outputs_type_0 = cast(list[Any], data) + + return outputs_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[Any] | None, data) + + outputs = _parse_outputs(d.pop("outputs")) + + + steps = [] + _steps = d.pop("steps") + for steps_item_data in (_steps): + steps_item = StepRun.from_dict(steps_item_data) + + + + steps.append(steps_item) + + + workflow_run_detail = cls( + id=id, + workflow_id=workflow_id, + version_id=version_id, + status=status, + error_message=error_message, + created_at=created_at, + inputs=inputs, + outputs=outputs, + steps=steps, + ) + + + workflow_run_detail.additional_properties = d + return workflow_run_detail + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_run_status_enum.py b/src/roe/_generated/models/workflow_run_status_enum.py new file mode 100644 index 0000000..9e38678 --- /dev/null +++ b/src/roe/_generated/models/workflow_run_status_enum.py @@ -0,0 +1,11 @@ +from enum import Enum + +class WorkflowRunStatusEnum(str, Enum): + CANCELLED = "cancelled" + FAILED = "failed" + PENDING = "pending" + RUNNING = "running" + SUCCEEDED = "succeeded" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/workflow_version.py b/src/roe/_generated/models/workflow_version.py new file mode 100644 index 0000000..5d343c9 --- /dev/null +++ b/src/roe/_generated/models/workflow_version.py @@ -0,0 +1,181 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="WorkflowVersion") + + + +@_attrs_define +class WorkflowVersion: + """ + Attributes: + id (UUID): + workflow_id (UUID): + is_current (bool): + read_only (bool): Saved in the old graph format: it still runs, but can only be edited by saving a new version. + version_name (None | str | Unset): + description (None | str | Unset): + format_version (int | Unset): + created_at (datetime.datetime | Unset): + """ + + id: UUID + workflow_id: UUID + is_current: bool + read_only: bool + version_name: None | str | Unset = UNSET + description: None | str | Unset = UNSET + format_version: int | Unset = UNSET + created_at: datetime.datetime | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = str(self.id) + + workflow_id = str(self.workflow_id) + + is_current = self.is_current + + read_only = self.read_only + + version_name: None | str | Unset + if isinstance(self.version_name, Unset): + version_name = UNSET + else: + version_name = self.version_name + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + format_version = self.format_version + + created_at: str | Unset = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "workflow_id": workflow_id, + "is_current": is_current, + "read_only": read_only, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if description is not UNSET: + field_dict["description"] = description + if format_version is not UNSET: + field_dict["format_version"] = format_version + if created_at is not UNSET: + field_dict["created_at"] = created_at + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + workflow_id = UUID(d.pop("workflow_id")) + + + + + is_current = d.pop("is_current") + + read_only = d.pop("read_only") + + def _parse_version_name(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + version_name = _parse_version_name(d.pop("version_name", UNSET)) + + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + + format_version = d.pop("format_version", UNSET) + + _created_at = d.pop("created_at", UNSET) + created_at: datetime.datetime | Unset + if isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) + + + + + workflow_version = cls( + id=id, + workflow_id=workflow_id, + is_current=is_current, + read_only=read_only, + version_name=version_name, + description=description, + format_version=format_version, + created_at=created_at, + ) + + + workflow_version.additional_properties = d + return workflow_version + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_version_create_request.py b/src/roe/_generated/models/workflow_version_create_request.py new file mode 100644 index 0000000..f74477e --- /dev/null +++ b/src/roe/_generated/models/workflow_version_create_request.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + + + + + +T = TypeVar("T", bound="WorkflowVersionCreateRequest") + + + +@_attrs_define +class WorkflowVersionCreateRequest: + """ + Attributes: + definition (WorkflowDefinitionRequest): + version_name (str | Unset): + description (str | Unset): + """ + + definition: WorkflowDefinitionRequest + version_name: str | Unset = UNSET + description: str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + definition = self.definition.to_dict() + + version_name = self.version_name + + description = self.description + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "definition": definition, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if description is not UNSET: + field_dict["description"] = description + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_definition_request import WorkflowDefinitionRequest + d = dict(src_dict) + definition = WorkflowDefinitionRequest.from_dict(d.pop("definition")) + + + + + version_name = d.pop("version_name", UNSET) + + description = d.pop("description", UNSET) + + workflow_version_create_request = cls( + definition=definition, + version_name=version_name, + description=description, + ) + + + workflow_version_create_request.additional_properties = d + return workflow_version_create_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflow_version_detail.py b/src/roe/_generated/models/workflow_version_detail.py new file mode 100644 index 0000000..f5925f1 --- /dev/null +++ b/src/roe/_generated/models/workflow_version_detail.py @@ -0,0 +1,233 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.workflow_definition import WorkflowDefinition + + + + + +T = TypeVar("T", bound="WorkflowVersionDetail") + + + +@_attrs_define +class WorkflowVersionDetail: + """ + Attributes: + id (UUID): + workflow_id (UUID): + is_current (bool): + read_only (bool): Saved in the old graph format: it still runs, but can only be edited by saving a new version. + definition (None | WorkflowDefinition): The steps, in the block format. Null for a read-only version. + conversion_reasons (list[str]): Why a read-only version couldn't be converted to the block format. + version_name (None | str | Unset): + description (None | str | Unset): + format_version (int | Unset): + created_at (datetime.datetime | Unset): + input_definitions (Any | Unset): + """ + + id: UUID + workflow_id: UUID + is_current: bool + read_only: bool + definition: None | WorkflowDefinition + conversion_reasons: list[str] + version_name: None | str | Unset = UNSET + description: None | str | Unset = UNSET + format_version: int | Unset = UNSET + created_at: datetime.datetime | Unset = UNSET + input_definitions: Any | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflow_definition import WorkflowDefinition + id = str(self.id) + + workflow_id = str(self.workflow_id) + + is_current = self.is_current + + read_only = self.read_only + + definition: dict[str, Any] | None + if isinstance(self.definition, WorkflowDefinition): + definition = self.definition.to_dict() + else: + definition = self.definition + + conversion_reasons = self.conversion_reasons + + + + version_name: None | str | Unset + if isinstance(self.version_name, Unset): + version_name = UNSET + else: + version_name = self.version_name + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + format_version = self.format_version + + created_at: str | Unset = UNSET + if not isinstance(self.created_at, Unset): + created_at = self.created_at.isoformat() + + input_definitions = self.input_definitions + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "workflow_id": workflow_id, + "is_current": is_current, + "read_only": read_only, + "definition": definition, + "conversion_reasons": conversion_reasons, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if description is not UNSET: + field_dict["description"] = description + if format_version is not UNSET: + field_dict["format_version"] = format_version + if created_at is not UNSET: + field_dict["created_at"] = created_at + if input_definitions is not UNSET: + field_dict["input_definitions"] = input_definitions + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflow_definition import WorkflowDefinition + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + workflow_id = UUID(d.pop("workflow_id")) + + + + + is_current = d.pop("is_current") + + read_only = d.pop("read_only") + + def _parse_definition(data: object) -> None | WorkflowDefinition: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + definition_type_0 = WorkflowDefinition.from_dict(data) + + + + return definition_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | WorkflowDefinition, data) + + definition = _parse_definition(d.pop("definition")) + + + conversion_reasons = cast(list[str], d.pop("conversion_reasons")) + + + def _parse_version_name(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + version_name = _parse_version_name(d.pop("version_name", UNSET)) + + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + + format_version = d.pop("format_version", UNSET) + + _created_at = d.pop("created_at", UNSET) + created_at: datetime.datetime | Unset + if isinstance(_created_at, Unset): + created_at = UNSET + else: + created_at = isoparse(_created_at) + + + + + input_definitions = d.pop("input_definitions", UNSET) + + workflow_version_detail = cls( + id=id, + workflow_id=workflow_id, + is_current=is_current, + read_only=read_only, + definition=definition, + conversion_reasons=conversion_reasons, + version_name=version_name, + description=description, + format_version=format_version, + created_at=created_at, + input_definitions=input_definitions, + ) + + + workflow_version_detail.additional_properties = d + return workflow_version_detail + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_create_response_400_type_0.py b/src/roe/_generated/models/workflows_create_response_400_type_0.py new file mode 100644 index 0000000..f07f831 --- /dev/null +++ b/src/roe/_generated/models/workflows_create_response_400_type_0.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsCreateResponse400Type0") + + + +@_attrs_define +class WorkflowsCreateResponse400Type0: + """ Validation failure: a map of field name to a list of error messages (DRF serializers) or a single message (e.g. + organization_id validation). + + """ + + additional_properties: dict[str, list[str] | str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + for prop_name, prop in self.additional_properties.items(): + + if isinstance(prop, list): + field_dict[prop_name] = prop + + + else: + field_dict[prop_name] = prop + + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflows_create_response_400_type_0 = cls( + ) + + + additional_properties = {} + for prop_name, prop_dict in d.items(): + def _parse_additional_property(data: object) -> list[str] | str: + try: + if not isinstance(data, list): + raise TypeError() + additional_property_type_0 = cast(list[str], data) + + return additional_property_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[str] | str, data) + + additional_property = _parse_additional_property(prop_dict) + + additional_properties[prop_name] = additional_property + + workflows_create_response_400_type_0.additional_properties = additional_properties + return workflows_create_response_400_type_0 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> list[str] | str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: list[str] | str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_create_response_400_type_1.py b/src/roe/_generated/models/workflows_create_response_400_type_1.py new file mode 100644 index 0000000..8912045 --- /dev/null +++ b/src/roe/_generated/models/workflows_create_response_400_type_1.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.workflows_create_response_400_type_1_errors_item import WorkflowsCreateResponse400Type1ErrorsItem + + + + + +T = TypeVar("T", bound="WorkflowsCreateResponse400Type1") + + + +@_attrs_define +class WorkflowsCreateResponse400Type1: + """ The definition failed its save checks; each error names its step. + + Attributes: + detail (str): + errors (list[WorkflowsCreateResponse400Type1ErrorsItem]): + """ + + detail: str + errors: list[WorkflowsCreateResponse400Type1ErrorsItem] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflows_create_response_400_type_1_errors_item import WorkflowsCreateResponse400Type1ErrorsItem + detail = self.detail + + errors = [] + for errors_item_data in self.errors: + errors_item = errors_item_data.to_dict() + errors.append(errors_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "detail": detail, + "errors": errors, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflows_create_response_400_type_1_errors_item import WorkflowsCreateResponse400Type1ErrorsItem + d = dict(src_dict) + detail = d.pop("detail") + + errors = [] + _errors = d.pop("errors") + for errors_item_data in (_errors): + errors_item = WorkflowsCreateResponse400Type1ErrorsItem.from_dict(errors_item_data) + + + + errors.append(errors_item) + + + workflows_create_response_400_type_1 = cls( + detail=detail, + errors=errors, + ) + + + workflows_create_response_400_type_1.additional_properties = d + return workflows_create_response_400_type_1 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_create_response_400_type_1_errors_item.py b/src/roe/_generated/models/workflows_create_response_400_type_1_errors_item.py new file mode 100644 index 0000000..066e948 --- /dev/null +++ b/src/roe/_generated/models/workflows_create_response_400_type_1_errors_item.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsCreateResponse400Type1ErrorsItem") + + + +@_attrs_define +class WorkflowsCreateResponse400Type1ErrorsItem: + """ + Attributes: + step_id (None | str): + message (str): + """ + + step_id: None | str + message: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + step_id: None | str + step_id = self.step_id + + message = self.message + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "step_id": step_id, + "message": message, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + def _parse_step_id(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + step_id = _parse_step_id(d.pop("step_id")) + + + message = d.pop("message") + + workflows_create_response_400_type_1_errors_item = cls( + step_id=step_id, + message=message, + ) + + + workflows_create_response_400_type_1_errors_item.additional_properties = d + return workflows_create_response_400_type_1_errors_item + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_partial_update_response_400_type_0.py b/src/roe/_generated/models/workflows_partial_update_response_400_type_0.py new file mode 100644 index 0000000..068aa94 --- /dev/null +++ b/src/roe/_generated/models/workflows_partial_update_response_400_type_0.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsPartialUpdateResponse400Type0") + + + +@_attrs_define +class WorkflowsPartialUpdateResponse400Type0: + """ Validation failure: a map of field name to a list of error messages (DRF serializers) or a single message (e.g. + organization_id validation). + + """ + + additional_properties: dict[str, list[str] | str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + for prop_name, prop in self.additional_properties.items(): + + if isinstance(prop, list): + field_dict[prop_name] = prop + + + else: + field_dict[prop_name] = prop + + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflows_partial_update_response_400_type_0 = cls( + ) + + + additional_properties = {} + for prop_name, prop_dict in d.items(): + def _parse_additional_property(data: object) -> list[str] | str: + try: + if not isinstance(data, list): + raise TypeError() + additional_property_type_0 = cast(list[str], data) + + return additional_property_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[str] | str, data) + + additional_property = _parse_additional_property(prop_dict) + + additional_properties[prop_name] = additional_property + + workflows_partial_update_response_400_type_0.additional_properties = additional_properties + return workflows_partial_update_response_400_type_0 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> list[str] | str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: list[str] | str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_partial_update_response_400_type_1.py b/src/roe/_generated/models/workflows_partial_update_response_400_type_1.py new file mode 100644 index 0000000..32f9f47 --- /dev/null +++ b/src/roe/_generated/models/workflows_partial_update_response_400_type_1.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.workflows_partial_update_response_400_type_1_errors_item import WorkflowsPartialUpdateResponse400Type1ErrorsItem + + + + + +T = TypeVar("T", bound="WorkflowsPartialUpdateResponse400Type1") + + + +@_attrs_define +class WorkflowsPartialUpdateResponse400Type1: + """ The definition failed its save checks; each error names its step. + + Attributes: + detail (str): + errors (list[WorkflowsPartialUpdateResponse400Type1ErrorsItem]): + """ + + detail: str + errors: list[WorkflowsPartialUpdateResponse400Type1ErrorsItem] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflows_partial_update_response_400_type_1_errors_item import WorkflowsPartialUpdateResponse400Type1ErrorsItem + detail = self.detail + + errors = [] + for errors_item_data in self.errors: + errors_item = errors_item_data.to_dict() + errors.append(errors_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "detail": detail, + "errors": errors, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflows_partial_update_response_400_type_1_errors_item import WorkflowsPartialUpdateResponse400Type1ErrorsItem + d = dict(src_dict) + detail = d.pop("detail") + + errors = [] + _errors = d.pop("errors") + for errors_item_data in (_errors): + errors_item = WorkflowsPartialUpdateResponse400Type1ErrorsItem.from_dict(errors_item_data) + + + + errors.append(errors_item) + + + workflows_partial_update_response_400_type_1 = cls( + detail=detail, + errors=errors, + ) + + + workflows_partial_update_response_400_type_1.additional_properties = d + return workflows_partial_update_response_400_type_1 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_partial_update_response_400_type_1_errors_item.py b/src/roe/_generated/models/workflows_partial_update_response_400_type_1_errors_item.py new file mode 100644 index 0000000..4fb039a --- /dev/null +++ b/src/roe/_generated/models/workflows_partial_update_response_400_type_1_errors_item.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsPartialUpdateResponse400Type1ErrorsItem") + + + +@_attrs_define +class WorkflowsPartialUpdateResponse400Type1ErrorsItem: + """ + Attributes: + step_id (None | str): + message (str): + """ + + step_id: None | str + message: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + step_id: None | str + step_id = self.step_id + + message = self.message + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "step_id": step_id, + "message": message, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + def _parse_step_id(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + step_id = _parse_step_id(d.pop("step_id")) + + + message = d.pop("message") + + workflows_partial_update_response_400_type_1_errors_item = cls( + step_id=step_id, + message=message, + ) + + + workflows_partial_update_response_400_type_1_errors_item.additional_properties = d + return workflows_partial_update_response_400_type_1_errors_item + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_1.py b/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_1.py new file mode 100644 index 0000000..5e185d9 --- /dev/null +++ b/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_1.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsRunsBatchCreateResponse400Type1") + + + +@_attrs_define +class WorkflowsRunsBatchCreateResponse400Type1: + """ Validation failure: a map of field name to a list of error messages (DRF serializers) or a single message (e.g. + organization_id validation). + + """ + + additional_properties: dict[str, list[str] | str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + for prop_name, prop in self.additional_properties.items(): + + if isinstance(prop, list): + field_dict[prop_name] = prop + + + else: + field_dict[prop_name] = prop + + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflows_runs_batch_create_response_400_type_1 = cls( + ) + + + additional_properties = {} + for prop_name, prop_dict in d.items(): + def _parse_additional_property(data: object) -> list[str] | str: + try: + if not isinstance(data, list): + raise TypeError() + additional_property_type_0 = cast(list[str], data) + + return additional_property_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[str] | str, data) + + additional_property = _parse_additional_property(prop_dict) + + additional_properties[prop_name] = additional_property + + workflows_runs_batch_create_response_400_type_1.additional_properties = additional_properties + return workflows_runs_batch_create_response_400_type_1 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> list[str] | str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: list[str] | str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_2.py b/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_2.py new file mode 100644 index 0000000..162dd71 --- /dev/null +++ b/src/roe/_generated/models/workflows_runs_batch_create_response_400_type_2.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="WorkflowsRunsBatchCreateResponse400Type2") + + + +@_attrs_define +class WorkflowsRunsBatchCreateResponse400Type2: + """ Hand-built application error body. + + Attributes: + error (str): + """ + + error: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + error = self.error + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "error": error, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + error = d.pop("error") + + workflows_runs_batch_create_response_400_type_2 = cls( + error=error, + ) + + + workflows_runs_batch_create_response_400_type_2.additional_properties = d + return workflows_runs_batch_create_response_400_type_2 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_runs_create_response_400_type_1.py b/src/roe/_generated/models/workflows_runs_create_response_400_type_1.py new file mode 100644 index 0000000..e801fd3 --- /dev/null +++ b/src/roe/_generated/models/workflows_runs_create_response_400_type_1.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsRunsCreateResponse400Type1") + + + +@_attrs_define +class WorkflowsRunsCreateResponse400Type1: + """ Validation failure: a map of field name to a list of error messages (DRF serializers) or a single message (e.g. + organization_id validation). + + """ + + additional_properties: dict[str, list[str] | str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + for prop_name, prop in self.additional_properties.items(): + + if isinstance(prop, list): + field_dict[prop_name] = prop + + + else: + field_dict[prop_name] = prop + + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflows_runs_create_response_400_type_1 = cls( + ) + + + additional_properties = {} + for prop_name, prop_dict in d.items(): + def _parse_additional_property(data: object) -> list[str] | str: + try: + if not isinstance(data, list): + raise TypeError() + additional_property_type_0 = cast(list[str], data) + + return additional_property_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[str] | str, data) + + additional_property = _parse_additional_property(prop_dict) + + additional_properties[prop_name] = additional_property + + workflows_runs_create_response_400_type_1.additional_properties = additional_properties + return workflows_runs_create_response_400_type_1 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> list[str] | str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: list[str] | str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_runs_create_response_400_type_2.py b/src/roe/_generated/models/workflows_runs_create_response_400_type_2.py new file mode 100644 index 0000000..b287daa --- /dev/null +++ b/src/roe/_generated/models/workflows_runs_create_response_400_type_2.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="WorkflowsRunsCreateResponse400Type2") + + + +@_attrs_define +class WorkflowsRunsCreateResponse400Type2: + """ Hand-built application error body. + + Attributes: + error (str): + """ + + error: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + error = self.error + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "error": error, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + error = d.pop("error") + + workflows_runs_create_response_400_type_2 = cls( + error=error, + ) + + + workflows_runs_create_response_400_type_2.additional_properties = d + return workflows_runs_create_response_400_type_2 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_versions_create_response_400_type_0.py b/src/roe/_generated/models/workflows_versions_create_response_400_type_0.py new file mode 100644 index 0000000..01d4fcc --- /dev/null +++ b/src/roe/_generated/models/workflows_versions_create_response_400_type_0.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsVersionsCreateResponse400Type0") + + + +@_attrs_define +class WorkflowsVersionsCreateResponse400Type0: + """ Validation failure: a map of field name to a list of error messages (DRF serializers) or a single message (e.g. + organization_id validation). + + """ + + additional_properties: dict[str, list[str] | str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + for prop_name, prop in self.additional_properties.items(): + + if isinstance(prop, list): + field_dict[prop_name] = prop + + + else: + field_dict[prop_name] = prop + + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflows_versions_create_response_400_type_0 = cls( + ) + + + additional_properties = {} + for prop_name, prop_dict in d.items(): + def _parse_additional_property(data: object) -> list[str] | str: + try: + if not isinstance(data, list): + raise TypeError() + additional_property_type_0 = cast(list[str], data) + + return additional_property_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(list[str] | str, data) + + additional_property = _parse_additional_property(prop_dict) + + additional_properties[prop_name] = additional_property + + workflows_versions_create_response_400_type_0.additional_properties = additional_properties + return workflows_versions_create_response_400_type_0 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> list[str] | str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: list[str] | str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_versions_create_response_400_type_1.py b/src/roe/_generated/models/workflows_versions_create_response_400_type_1.py new file mode 100644 index 0000000..75368dc --- /dev/null +++ b/src/roe/_generated/models/workflows_versions_create_response_400_type_1.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.workflows_versions_create_response_400_type_1_errors_item import WorkflowsVersionsCreateResponse400Type1ErrorsItem + + + + + +T = TypeVar("T", bound="WorkflowsVersionsCreateResponse400Type1") + + + +@_attrs_define +class WorkflowsVersionsCreateResponse400Type1: + """ The definition failed its save checks; each error names its step. + + Attributes: + detail (str): + errors (list[WorkflowsVersionsCreateResponse400Type1ErrorsItem]): + """ + + detail: str + errors: list[WorkflowsVersionsCreateResponse400Type1ErrorsItem] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.workflows_versions_create_response_400_type_1_errors_item import WorkflowsVersionsCreateResponse400Type1ErrorsItem + detail = self.detail + + errors = [] + for errors_item_data in self.errors: + errors_item = errors_item_data.to_dict() + errors.append(errors_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "detail": detail, + "errors": errors, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.workflows_versions_create_response_400_type_1_errors_item import WorkflowsVersionsCreateResponse400Type1ErrorsItem + d = dict(src_dict) + detail = d.pop("detail") + + errors = [] + _errors = d.pop("errors") + for errors_item_data in (_errors): + errors_item = WorkflowsVersionsCreateResponse400Type1ErrorsItem.from_dict(errors_item_data) + + + + errors.append(errors_item) + + + workflows_versions_create_response_400_type_1 = cls( + detail=detail, + errors=errors, + ) + + + workflows_versions_create_response_400_type_1.additional_properties = d + return workflows_versions_create_response_400_type_1 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/workflows_versions_create_response_400_type_1_errors_item.py b/src/roe/_generated/models/workflows_versions_create_response_400_type_1_errors_item.py new file mode 100644 index 0000000..e74cc12 --- /dev/null +++ b/src/roe/_generated/models/workflows_versions_create_response_400_type_1_errors_item.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="WorkflowsVersionsCreateResponse400Type1ErrorsItem") + + + +@_attrs_define +class WorkflowsVersionsCreateResponse400Type1ErrorsItem: + """ + Attributes: + step_id (None | str): + message (str): + """ + + step_id: None | str + message: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + step_id: None | str + step_id = self.step_id + + message = self.message + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "step_id": step_id, + "message": message, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + def _parse_step_id(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + step_id = _parse_step_id(d.pop("step_id")) + + + message = d.pop("message") + + workflows_versions_create_response_400_type_1_errors_item = cls( + step_id=step_id, + message=message, + ) + + + workflows_versions_create_response_400_type_1_errors_item.additional_properties = d + return workflows_versions_create_response_400_type_1_errors_item + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/api/_generated_registry.py b/src/roe/api/_generated_registry.py index 28755ce..5e62722 100644 --- a/src/roe/api/_generated_registry.py +++ b/src/roe/api/_generated_registry.py @@ -10,6 +10,7 @@ from roe.api.discovery import DiscoveryAPI from roe.api.skill_sets import SkillSetsAPI from roe.api.tables import TablesAPI +from roe.api.workflows import WorkflowsAPI GENERATED_API_CLASSES = { @@ -18,4 +19,5 @@ "discovery": DiscoveryAPI, "skill_sets": SkillSetsAPI, "tables": TablesAPI, + "workflows": WorkflowsAPI, } diff --git a/src/roe/api/workflows.py b/src/roe/api/workflows.py new file mode 100644 index 0000000..37fe0b9 --- /dev/null +++ b/src/roe/api/workflows.py @@ -0,0 +1,286 @@ +"""Auto-generated friendly API facades for the Roe SDK.""" + +# Generated by scripts/generate-sdk from openapi/wrappers.yml. +# Do not edit by hand. + +from __future__ import annotations + +from typing import Any +from uuid import UUID + +from roe._generated.api.workflows import ( + workflows_create, + workflows_destroy, + workflows_list, + workflows_partial_update, + workflows_retrieve, + workflows_runs_batch_create, + workflows_runs_create, + workflows_runs_list, + workflows_runs_retrieve, + workflows_versions_create, + workflows_versions_list, + workflows_versions_retrieve, + workflows_versions_set_current_create, +) +from roe._generated.client import AuthenticatedClient +from roe._generated.models.paginated_workflow_list import PaginatedWorkflowList +from roe._generated.models.paginated_workflow_run_list import PaginatedWorkflowRunList +from roe._generated.models.paginated_workflow_version_list import ( + PaginatedWorkflowVersionList, +) +from roe._generated.models.workflow_detail import WorkflowDetail +from roe._generated.models.workflow_run_batch import WorkflowRunBatch +from roe._generated.models.workflow_run_detail import WorkflowRunDetail +from roe._generated.models.workflow_version_detail import WorkflowVersionDetail +from roe._generated.types import UNSET +from roe.config import RoeConfig +from roe.utils.generated_request import request_json, request_raw + + +class WorkflowsAPI: + """Build, version and run block-format workflows.""" + + def __init__(self, config: RoeConfig, raw_client: AuthenticatedClient): + self.config = config + self._raw = raw_client + + @property + def _org_id(self) -> UUID: + return UUID(str(self.config.organization_id)) + + def list( + self, + page: int | None = None, + page_size: int | None = None, + search: str | None = None, + ) -> PaginatedWorkflowList: + """List workflows.""" + response = request_raw( + self._raw, + workflows_list, + page=page if page is not None else UNSET, + page_size=page_size if page_size is not None else UNSET, + search=search if search is not None else UNSET, + organization_id=self._org_id, + ) + return PaginatedWorkflowList.from_dict(response.json()) + + def create( + self, + name: str, + definition: dict[str, Any], + version_name: str | None = None, + description: str | None = None, + ) -> WorkflowDetail: + """Create a workflow from a block-format definition.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["name"] = name + body["definition"] = definition + if version_name is not None: + body["version_name"] = version_name + if description is not None: + body["description"] = description + resp = request_json( + self._raw, + workflows_create, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def retrieve( + self, + workflow_id: str, + ) -> WorkflowDetail: + """Retrieve a workflow with its current version.""" + response = request_raw( + self._raw, + workflows_retrieve, + workflow_id, + organization_id=self._org_id, + ) + return WorkflowDetail.from_dict(response.json()) + + def update( + self, + workflow_id: str, + name: str, + ) -> WorkflowDetail: + """Rename a workflow.""" + body: dict[str, Any] = {} + body["name"] = name + resp = request_json( + self._raw, + workflows_partial_update, + workflow_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def delete( + self, + workflow_id: str, + ) -> None: + """Delete a workflow and its versions.""" + request_raw( + self._raw, + workflows_destroy, + workflow_id, + organization_id=self._org_id, + ) + return None + + def list_versions( + self, + workflow_id: str, + page: int | None = None, + page_size: int | None = None, + ) -> PaginatedWorkflowVersionList: + """List versions of a workflow, newest first.""" + response = request_raw( + self._raw, + workflows_versions_list, + workflow_id, + page=page if page is not None else UNSET, + page_size=page_size if page_size is not None else UNSET, + organization_id=self._org_id, + ) + return PaginatedWorkflowVersionList.from_dict(response.json()) + + def create_version( + self, + workflow_id: str, + definition: dict[str, Any], + version_name: str | None = None, + description: str | None = None, + ) -> WorkflowVersionDetail: + """Save a new version of a workflow and make it current.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["definition"] = definition + if version_name is not None: + body["version_name"] = version_name + if description is not None: + body["description"] = description + resp = request_json( + self._raw, + workflows_versions_create, + workflow_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def retrieve_version( + self, + workflow_id: str, + version_id: str, + ) -> WorkflowVersionDetail: + """Retrieve one version of a workflow.""" + response = request_raw( + self._raw, + workflows_versions_retrieve, + workflow_id, + version_id, + organization_id=self._org_id, + ) + return WorkflowVersionDetail.from_dict(response.json()) + + def set_current_version( + self, + workflow_id: str, + version_id: str, + ) -> WorkflowVersionDetail: + """Make a version the one that runs by default.""" + response = request_raw( + self._raw, + workflows_versions_set_current_create, + workflow_id, + version_id, + organization_id=self._org_id, + ) + return WorkflowVersionDetail.from_dict(response.json()) + + def list_runs( + self, + workflow_id: str, + page: int | None = None, + page_size: int | None = None, + limit: int | None = None, + ) -> PaginatedWorkflowRunList: + """List runs of a workflow, newest first.""" + response = request_raw( + self._raw, + workflows_runs_list, + workflow_id, + page=page if page is not None else UNSET, + page_size=page_size if page_size is not None else UNSET, + limit=limit if limit is not None else UNSET, + organization_id=self._org_id, + ) + return PaginatedWorkflowRunList.from_dict(response.json()) + + def run( + self, + workflow_id: str, + inputs: dict[str, Any] | None = None, + version_id: str | None = None, + metadata: dict[str, Any] | None = None, + wait: bool | None = None, + ) -> WorkflowRunDetail: + """Start a run. Set wait to wait up to 60 seconds for it to finish.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + if inputs is not None: + body["inputs"] = inputs + if version_id is not None: + body["version_id"] = version_id + if metadata is not None: + body["metadata"] = metadata + if wait is not None: + body["wait"] = wait + resp = request_json( + self._raw, + workflows_runs_create, + workflow_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def run_batch( + self, + workflow_id: str, + inputs: list[dict[str, Any]], + version_id: str | None = None, + ) -> WorkflowRunBatch: + """Start one run per item of inputs.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["inputs"] = inputs + if version_id is not None: + body["version_id"] = version_id + resp = request_json( + self._raw, + workflows_runs_batch_create, + workflow_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def retrieve_run( + self, + run_id: str, + ) -> WorkflowRunDetail: + """Retrieve a run with its outputs and step results.""" + response = request_raw( + self._raw, + workflows_runs_retrieve, + run_id, + organization_id=self._org_id, + ) + return WorkflowRunDetail.from_dict(response.json()) diff --git a/uv.lock b/uv.lock index 7b3337a..e8d35a2 100644 --- a/uv.lock +++ b/uv.lock @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "roe-ai" -version = "1.1.19" +version = "1.1.20" source = { editable = "." } dependencies = [ { name = "attrs" }, From 78d512b9a890c2de525aef9141adee02188848bd Mon Sep 17 00:00:00 2001 From: Chen-ROE Date: Tue, 27 Oct 2026 11:36:45 -0700 Subject: [PATCH 2/2] Don't resend a POST or PATCH that may have reached the server RoeRetryTransport retried every httpx.TransportError for every method. A read timeout, a dropped connection, or a protocol error can happen after the server has received the request, so a POST was replayed up to max_retries times. With workflows.run(wait=True), the server holds the request for 60 seconds and the client times out at 60, so a long run reached a local test server four times: one call would start four runs. POST and PATCH now retry only ConnectError, ConnectTimeout and PoolTimeout, which are raised before any bytes are sent. Idempotent methods and the status-code retries are unchanged. This matches the other SDKs: the TypeScript retry middleware only retries on response status codes, and Go does not retry a request that hit its deadline. The module docstring's claim of alignment is corrected. The fix lives in src/roe/utils, outside the paths the roe-main fan-out regenerates, so later release PRs keep it. The test file is force-added like the rest of tests/, which .gitignore lists. Co-Authored-By: Claude Opus 5.5 --- src/roe/utils/transport.py | 14 +++++++--- tests/unit/test_retry_transport.py | 44 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/unit/test_retry_transport.py diff --git a/src/roe/utils/transport.py b/src/roe/utils/transport.py index d18fce6..e7f3f12 100644 --- a/src/roe/utils/transport.py +++ b/src/roe/utils/transport.py @@ -3,9 +3,9 @@ Retries failed requests with exponential backoff (capped at ~10 seconds): - Transport errors: ``httpx.TransportError`` (disconnects, timeouts, etc.). -- HTTP statuses: ``5xx``, ``408``, ``429``. -- Applies to **all** HTTP methods, including POST (replay is handled by httpx / - rewindable buffers for JSON-encoded bodies). + POST and PATCH retry only errors raised before the request was sent, so a + timed-out run is never started twice. +- HTTP statuses: ``5xx``, ``408``, ``429``, for all HTTP methods. Multipart agent-run helpers opt out via the ``x-roe-skip-retry`` header so those POSTs are not retried (non-idempotent streamed bodies). @@ -26,6 +26,9 @@ logger = logging.getLogger(__name__) _BYPASS_HEADER = "x-roe-skip-retry" +_NON_IDEMPOTENT_METHODS = {"POST", "PATCH"} +# Raised before any bytes reach the server, so resending cannot duplicate work. +_UNSENT_ERRORS = (httpx.ConnectError, httpx.ConnectTimeout, httpx.PoolTimeout) def _should_retry_status(status_code: int) -> bool: @@ -47,7 +50,10 @@ def handle_request(self, request: httpx.Request) -> httpx.Response: try: response = super().handle_request(request) except httpx.TransportError as exc: - if attempt >= self.max_retries: + if attempt >= self.max_retries or ( + request.method in _NON_IDEMPOTENT_METHODS + and not isinstance(exc, _UNSENT_ERRORS) + ): raise wait_time = min(2**attempt, 10) logger.warning( diff --git a/tests/unit/test_retry_transport.py b/tests/unit/test_retry_transport.py new file mode 100644 index 0000000..a45b63e --- /dev/null +++ b/tests/unit/test_retry_transport.py @@ -0,0 +1,44 @@ +"""Verify RoeRetryTransport only replays requests that are safe to send twice.""" + +from __future__ import annotations + +import os +import sys + +import httpx +import pytest + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src")) + +from roe.utils import transport # noqa: E402 +from roe.utils.transport import RoeRetryTransport # noqa: E402 + + +@pytest.mark.parametrize( + ("method", "error", "expected_attempts"), + [ + # The request may already have reached the server: never resend a POST. + ("POST", httpx.ReadTimeout, 1), + ("PATCH", httpx.RemoteProtocolError, 1), + # The request never left the client, so resending is safe. + ("POST", httpx.ConnectError, 4), + ("POST", httpx.ConnectTimeout, 4), + # Idempotent methods keep retrying every transport error. + ("GET", httpx.ReadTimeout, 4), + ("DELETE", httpx.ReadTimeout, 4), + ], +) +def test_transport_error_retries(monkeypatch, method, error, expected_attempts): + attempts = [] + + def fail(self, request): + attempts.append(request.method) + raise error("boom", request=request) + + monkeypatch.setattr(httpx.HTTPTransport, "handle_request", fail) + monkeypatch.setattr(transport.time, "sleep", lambda _: None) + + request = httpx.Request(method, "https://api.roe-ai.com/v1/workflows/w/runs/") + with pytest.raises(error): + RoeRetryTransport(max_retries=3).handle_request(request) + assert len(attempts) == expected_attempts