diff --git a/.roe-main-release-version b/.roe-main-release-version index 41158aa..9c92fcf 100644 --- a/.roe-main-release-version +++ b/.roe-main-release-version @@ -1 +1 @@ -1-0-96 +1-1-0 diff --git a/README.md b/README.md index 3862e83..1b9b3f4 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.14** - SDK operation coverage is synchronized across Python, +> **v1.1.15** - 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 d75d46d..25545ca 100644 --- a/SDK_EXAMPLES.md +++ b/SDK_EXAMPLES.md @@ -819,6 +819,198 @@ result = client.policies.versions.retrieve( ) ``` +### Skill Sets + +#### `skill_sets_list` + +List the org's skill sets and create a new one. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.list( + ordering="ordering", # optional + page=1, # optional + page_size=1, # optional + search="search", # optional +) +``` + +#### `skill_sets_create` + +List the org's skill sets and create a new one. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.create( + name="name", # required + description="description", # optional +) +``` + +#### `skill_sets_retrieve` + +Retrieve, update, or delete a single skill set. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.retrieve( + id="id", # required +) +``` + +#### `skill_sets_partial_update` + +Retrieve, update, or delete a single skill set. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.update( + id="id", # required + name="name", # optional + description="description", # optional +) +``` + +#### `skill_sets_destroy` + +Retrieve, update, or delete a single skill set. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.delete( + id="id", # required +) +``` + +#### `skill_sets_versions_list` + +List a skill set's versions, or create a new version. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.list_versions( + skill_set_id="skill_set_id", # required + page=1, # optional + page_size=1, # optional +) +``` + +#### `skill_sets_versions_create` + +List a skill set's versions, or create a new version. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.create_version( + skill_set_id="skill_set_id", # required + files=[{"relative_path": "SKILL.md", "content": "# Skill"}], # required + version_name="version_name", # optional + base_version_id="base_version_id", # optional + summary="summary", # optional + file_changes=[{"path": "SKILL.md", "status": "edited", "note": "Updated labels"}], # optional +) +``` + +#### `skill_sets_versions_retrieve` + +Retrieve a version by its id, or by a set id (-> that set's current version). + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.retrieve_version( + id="id", # required +) +``` + +#### `skill_sets_set_current_version` + +Point a skill set at a specific version (set-current / rollback). + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.set_current_version( + skill_set_id="skill_set_id", # required + version_id="version_id", # required +) +``` + +#### `skill_sets_generate_version` + +Author the next version of a skill set with an agent. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.generate_version( + skill_set_id="skill_set_id", # required + use_case="use_case", # required + base_version_id="base_version_id", # optional + auto_commit=True, # optional + table_names=["value"], # optional + attachments=["value"], # optional + policy_id="policy_id", # optional + policy_version_id="policy_version_id", # optional +) +``` + +#### `skill_sets_generation_retrieve` + +Returns the last generation and its status, or generation: null when no run exists. + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.get_generation( + skill_set_id="skill_set_id", # required +) +``` + +#### `skill_sets_generation_cancel` + +Stop tracking a generation, cancelling it if it is still running + +```python +from roe import RoeClient + +client = RoeClient() + +result = client.skill_sets.cancel_generation( + skill_set_id="skill_set_id", # required + run_id="run_id", # required +) +``` + ### Tables #### `tables_list` diff --git a/openapi/openapi.yml b/openapi/openapi.yml index 878e353..b94ff66 100644 --- a/openapi/openapi.yml +++ b/openapi/openapi.yml @@ -121,6 +121,16 @@ paths: items: type: string description: Filter agents by tag IDs. Can be provided multiple times. + - in: query + name: tags_match + schema: + type: string + enum: + - all + - any + description: 'How `tags` and `include_untagged` combine: `any` (default) lists + agents matching any of them; `all` lists agents carrying every tag, and + no visible user tags when `include_untagged` is set.' - in: query name: updated_from schema: @@ -3348,14 +3358,46 @@ paths: schema: $ref: '#/components/schemas/ErrorDetailResponse' description: Policy or policy version not found. - /v1/tables/: + /v1/skills/: get: - operationId: tables_list - description: List Roe tables in the authenticated organization with column information. - summary: List Roe tables + operationId: skill_sets_list + description: List the org's skill sets and create a new one. + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - 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: - - tables - sdk + - skill_sets security: - apiKeyAuth: [] responses: @@ -3363,60 +3405,67 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TableListResponse' + $ref: '#/components/schemas/PaginatedSkillSetList' description: '' - /v1/tables/{table_name}/: - delete: - operationId: tables_destroy - description: Permanently drop one Roe table from the authenticated organization - and remove table-link metadata that references it. - summary: Delete a Roe table - parameters: - - in: path - name: table_name - schema: - type: string - required: true + post: + operationId: skill_sets_create + description: List the org's skill sets and create a new one. tags: - - tables - sdk + - skill_sets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSkillSetRequest' + required: true security: - apiKeyAuth: [] responses: - '204': - description: No response body - '400': + '201': content: application/json: schema: - type: array - items: - type: string - description: 'DRF ValidationError raised with a message string: the - body is a bare JSON array of error messages.' - description: Invalid table name (bare array of messages). - '404': + $ref: '#/components/schemas/CreateSkillSet' + description: Skill set created successfully. + '400': content: application/json: schema: - $ref: '#/components/schemas/ErrorDetailResponse' - description: Table not found - /v1/tables/{table_name}/describe/: + type: object + additionalProperties: {} + description: Invalid request data. + 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/skills/{id}/: get: - operationId: tables_describe_retrieve - description: Return table metadata only for one Roe table in the authenticated - organization, including columns and cheap ClickHouse metadata such as row - count and the latest metadata-modification timestamp when available. - summary: Describe a Roe table + operationId: skill_sets_retrieve + description: Retrieve, update, or delete a single skill set. parameters: - in: path - name: table_name + name: 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: - - tables - sdk + - skill_sets security: - apiKeyAuth: [] responses: @@ -3424,48 +3473,40 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TableDescribeResponse' + $ref: '#/components/schemas/SkillSet' description: '' - '400': - content: - application/json: - schema: - type: array - items: - type: string - description: 'DRF ValidationError raised with a message string: the - body is a bare JSON array of error messages.' - description: Invalid table name (bare array of messages). '404': content: application/json: schema: $ref: '#/components/schemas/ErrorDetailResponse' - description: Table not found - /v1/tables/{table_name}/preview/: - get: - operationId: tables_preview_retrieve - description: Return column metadata plus a bounded sample of rows from one Roe - table in the authenticated organization. - summary: Preview a Roe table + description: '' + patch: + operationId: skill_sets_partial_update + description: Retrieve, update, or delete a single skill set. parameters: - - in: query - name: limit - schema: - type: integer - maximum: 50 - minimum: 0 - default: 3 - description: Maximum number of sample rows to return. Use 0 to return only - table and column metadata without reading sample rows. - in: path - name: table_name + name: 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: - - tables - sdk + - skill_sets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedUpdateSkillSetRequest' security: - apiKeyAuth: [] responses: @@ -3473,89 +3514,554 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TablePreviewResponse' + $ref: '#/components/schemas/UpdateSkillSet' description: '' - '400': + delete: + operationId: skill_sets_destroy + description: Retrieve, update, or delete a single skill set. + parameters: + - in: path + name: 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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '204': + description: Skill set deleted successfully. + '404': 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: Invalid table name (bare array of messages) or invalid limit - query param (field error map). - '404': + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + '409': content: application/json: schema: - $ref: '#/components/schemas/ErrorDetailResponse' - description: Table not found - /v1/tables/query/: + $ref: '#/components/schemas/SkillSetDeleteConflict' + description: Skill set is in use by agents and cannot be deleted. + /v1/skills/{skill_set_id}/generate-version/: post: - operationId: tables_query_create - description: Run a read-only SQL query over public Roe tables. - summary: Run a read-only Roe table query + operationId: skill_sets_generate_version + description: |- + Author the next version of a skill set with an agent. + + Starts the generation workflow and returns where to stream it. The agent + reads the customer's use case, profiles the linked tables, reads the + attached CSVs and documents, and rewrites the customer layer of the skill. + + By default nothing is written here: the generated file set comes back for + review and is saved through the normal version-create path. With + ``auto_commit`` the workflow saves it through that same path on success. + parameters: + - in: path + name: skill_set_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: - - tables - sdk + - skill_sets requestBody: content: application/json: schema: - $ref: '#/components/schemas/TableQueryRequest' + $ref: '#/components/schemas/GenerateSkillSetVersionRequest' required: true security: - apiKeyAuth: [] responses: - '202': + '200': content: application/json: schema: - $ref: '#/components/schemas/TableQuerySubmitResponse' - description: '' + $ref: '#/components/schemas/GenerateSkillSetVersionResponse' + description: Generation started; stream it at sse_endpoint. '400': content: application/json: schema: 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).' - description: Invalid request body (field error map). - /v1/tables/query/{table_query_id}/result/: + additionalProperties: {} + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/skills/{skill_set_id}/generation/: get: - operationId: tables_query_result_retrieve - description: Poll or fetch one public Roe table query result. - summary: Get a Roe table query result + operationId: skill_sets_generation_retrieve + description: 'Returns the last generation and its status, or generation: null + when no run exists.' + parameters: + - in: path + name: skill_set_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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PublicSkillSetGeneration' + description: '' + /v1/skills/{skill_set_id}/generation/{run_id}/: + delete: + operationId: skill_sets_generation_cancel + description: Used when the operator cancels, when a finished draft has been + loaded into the editor, and when a run turns out to be unrecoverable. Cancelling + a run that already finished is harmless. + summary: Stop tracking a generation, cancelling it if it is still running + parameters: + - in: path + name: run_id + schema: + type: string + format: uuid + required: true + - in: path + name: skill_set_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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '204': + description: Run stopped and no longer tracked. + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + '502': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/skills/{skill_set_id}/set-current-version/{version_id}/: + patch: + operationId: skill_sets_set_current_version + description: Point a skill set at a specific version (set-current / rollback). + parameters: + - in: path + name: skill_set_id + schema: + type: string + format: uuid + required: true + - in: path + name: version_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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/SkillSet' + description: '' + /v1/skills/{skill_set_id}/versions/: + get: + operationId: skill_sets_versions_list + description: List a skill set's versions, or create a new version. + 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: skill_set_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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedSkillSetVersionList' + description: '' + post: + operationId: skill_sets_versions_create + description: List a skill set's versions, or create a new version. + parameters: + - in: path + name: skill_set_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: + - sdk + - skill_sets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSkillSetVersionRequest' + required: true + security: + - apiKeyAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSkillSetVersion' + description: Skill set version created successfully. + '400': + content: + application/json: + schema: + type: object + additionalProperties: {} + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: '' + /v1/skills/versions/{id}/: + get: + operationId: skill_sets_versions_retrieve + description: Retrieve a version by its id, or by a set id (-> that set's current + version). + parameters: + - in: path + name: 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: + - sdk + - skill_sets + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/SkillSetVersion' + description: '' + /v1/tables/: + get: + operationId: tables_list + description: List Roe tables in the authenticated organization with column information. + summary: List Roe tables + tags: + - tables + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableListResponse' + description: '' + /v1/tables/{table_name}/: + delete: + operationId: tables_destroy + description: Permanently drop one Roe table from the authenticated organization + and remove table-link metadata that references it. + summary: Delete a Roe table + parameters: + - in: path + name: table_name + schema: + type: string + required: true + tags: + - tables + - sdk + security: + - apiKeyAuth: [] + responses: + '204': + description: No response body + '400': + content: + application/json: + schema: + type: array + items: + type: string + description: 'DRF ValidationError raised with a message string: the + body is a bare JSON array of error messages.' + description: Invalid table name (bare array of messages). + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: Table not found + /v1/tables/{table_name}/describe/: + get: + operationId: tables_describe_retrieve + description: Return table metadata only for one Roe table in the authenticated + organization, including columns and cheap ClickHouse metadata such as row + count and the latest metadata-modification timestamp when available. + summary: Describe a Roe table + parameters: + - in: path + name: table_name + schema: + type: string + required: true + tags: + - tables + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableDescribeResponse' + description: '' + '400': + content: + application/json: + schema: + type: array + items: + type: string + description: 'DRF ValidationError raised with a message string: the + body is a bare JSON array of error messages.' + description: Invalid table name (bare array of messages). + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: Table not found + /v1/tables/{table_name}/preview/: + get: + operationId: tables_preview_retrieve + description: Return column metadata plus a bounded sample of rows from one Roe + table in the authenticated organization. + summary: Preview a Roe table + parameters: + - in: query + name: limit + schema: + type: integer + maximum: 50 + minimum: 0 + default: 3 + description: Maximum number of sample rows to return. Use 0 to return only + table and column metadata without reading sample rows. + - in: path + name: table_name + schema: + type: string + required: true + tags: + - tables + - sdk + security: + - apiKeyAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TablePreviewResponse' + 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: Invalid table name (bare array of messages) or invalid limit + query param (field error map). + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDetailResponse' + description: Table not found + /v1/tables/query/: + post: + operationId: tables_query_create + description: Run a read-only SQL query over public Roe tables. + summary: Run a read-only Roe table query + tags: + - tables + - sdk + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableQueryRequest' + required: true + security: + - apiKeyAuth: [] + responses: + '202': + content: + application/json: + schema: + $ref: '#/components/schemas/TableQuerySubmitResponse' + description: '' + '400': + content: + application/json: + schema: + 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).' + description: Invalid request body (field error map). + /v1/tables/query/{table_query_id}/result/: + get: + operationId: tables_query_result_retrieve + description: Poll or fetch one public Roe table query result. + summary: Get a Roe table query result parameters: - in: path name: table_query_id @@ -4116,12 +4622,17 @@ components: type: integer description: Count of agents using this tag readOnly: true + private: + type: boolean + readOnly: true + description: Visible only to its owner (the Pinned group). required: - color - created_at - creator - id - name + - private - usage_count AgentVersion: type: object @@ -4167,7 +4678,10 @@ components: type: array items: $ref: '#/components/schemas/AgentInputDefinition' - description: List of input definitions for this agent version. + description: List of input definitions for this agent version. Engines with + fixed job inputs (the policy-aware investigation engines) accept only + the keys they declare; any additional key is rejected. Per-case detail + belongs inside the value of an accepted field, which is free text. engine_config: description: Engine configuration. post_actions: @@ -4217,7 +4731,10 @@ components: - 'null' description: Description for the agent version. input_definitions: - description: List of input definitions for this agent version. + description: List of input definitions for this agent version. Engines with + fixed job inputs (the policy-aware investigation engines) accept only + the keys they declare; any additional key is rejected. Per-case detail + belongs inside the value of an accepted field, which is free text. engine_config: description: Engine configuration as a dictionary of string key-value pairs. post_actions: @@ -4360,7 +4877,10 @@ components: minLength: 1 description: Description of the first version. input_definitions: - description: Input definitions for the first version. + description: Input definitions for the first version. Engines with fixed + job inputs (the policy-aware investigation engines) accept only the keys + they declare; any additional key is rejected. Per-case detail belongs + inside the value of an accepted field, which is free text. engine_config: description: Engine configuration for the first version. required: @@ -4450,6 +4970,12 @@ components: type: object additionalProperties: {} readOnly: true + browser_session_expires_at: + type: + - string + - 'null' + format: date-time + readOnly: true status: $ref: '#/components/schemas/StatusEnum' created_at: @@ -4462,6 +4988,7 @@ components: readOnly: true required: - auth_config + - browser_session_expires_at - connector_display_name - connector_type - created_at @@ -4473,6 +5000,38 @@ components: - organization - updated_at - user + ConnectionAuthenticationCheck: + type: object + properties: + status: + $ref: '#/components/schemas/ConnectionAuthenticationCheckStatusEnum' + message: + type: string + required: + - message + - status + ConnectionAuthenticationCheckStatusEnum: + enum: + - passed + - failed + - not_configured + - unsupported + type: string + description: |- + * `passed` - passed + * `failed` - failed + * `not_configured` - not_configured + * `unsupported` - unsupported + ConnectionAuthenticationChecks: + type: object + properties: + api: + $ref: '#/components/schemas/ConnectionAuthenticationCheck' + dashboard: + $ref: '#/components/schemas/ConnectionAuthenticationCheck' + required: + - api + - dashboard ConnectionDeleteErrorResponse: type: object properties: @@ -4546,6 +5105,19 @@ components: - organization - updated_at - user + ConnectorBrowserSession: + type: object + properties: + field: + type: string + description: Auth field the capture button sits beside. + required_config: + type: object + additionalProperties: {} + description: Config values required before signing in. + required: + - field + - required_config ConnectorListResponse: type: object properties: @@ -4587,8 +5159,13 @@ components: type: array items: type: string + browser_session: + oneOf: + - $ref: '#/components/schemas/ConnectorBrowserSession' + - type: 'null' required: - auth_schema + - browser_session - category - config_schema - delivery_config_schema @@ -4773,6 +5350,139 @@ components: description: ID of the version this was derived from required: - content + CreateSkillSet: + type: object + description: |- + Create a new skill set. Its version 0 is always the base skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + 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 + CreateSkillSetRequest: + type: object + description: |- + Create a new skill set. Its version 0 is always the base skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + knowledge_base_key_id: + type: + - string + - 'null' + format: uuid + required: + - name + CreateSkillSetVersion: + type: object + description: Create a new (full) version of an existing skill set. + properties: + id: + type: string + format: uuid + readOnly: true + version_name: + type: string + description: Version name (auto-generated if not provided). + maxLength: 255 + summary: + type: string + default: '' + description: What this version changed and why, in plain language. + file_changes: + type: array + items: + type: object + additionalProperties: {} + description: 'Per-file walkthrough: [{path, status, note, added_lines, removed_lines}]. + status is created, edited, or untouched.' + files: + type: array + items: + $ref: '#/components/schemas/SkillFile' + description: The complete file set for this new version. + required: + - files + - id + CreateSkillSetVersionRequest: + type: object + description: Create a new (full) version of an existing skill set. + properties: + version_name: + type: string + minLength: 1 + description: Version name (auto-generated if not provided). + maxLength: 255 + base_version_id: + type: string + format: uuid + writeOnly: true + description: ID of the version this was derived from. + summary: + type: string + default: '' + description: What this version changed and why, in plain language. + file_changes: + type: array + items: + type: object + additionalProperties: {} + description: 'Per-file walkthrough: [{path, status, note, added_lines, removed_lines}]. + status is created, edited, or untouched.' + files: + type: array + items: + $ref: '#/components/schemas/SkillFileRequest' + description: The complete file set for this new version. + required: + - files DependentAgentInfo: type: object description: An agent version that references a policy (see get_agents_using_policy). @@ -4826,6 +5536,78 @@ components: description: Human-readable error detail required: - detail + GenerateSkillSetVersionRequest: + type: object + description: |- + Request to author the next version of a skill set with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + properties: + use_case: + type: string + minLength: 1 + description: 'What the company does and what this agent decides: the decision + scope, the labels it may apply, and anything it must always do.' + base_version_id: + type: string + format: uuid + description: Version to start from. Defaults to the set's current version. + auto_commit: + type: boolean + default: false + description: Save the generated draft as the set's next version automatically + when the run succeeds, skipping draft review. Agents following the set + pick the new version up the moment it lands. + table_names: + type: array + items: + type: string + minLength: 1 + description: Roe table names the agent may profile to learn the data shape. + attachments: + type: array + items: + type: string + minLength: 1 + description: File IDs (file_) of CSVs or documents to read. + policy_id: + type: string + format: uuid + description: Policy whose dispositions the generated skill must use as its + label list. Omit to let the agent choose labels from the use case. + policy_version_id: + type: string + format: uuid + description: Requires policy_id. Which version of that policy to read. Defaults + to the policy's current version. An agent may be pinned to an older one. + required: + - use_case + GenerateSkillSetVersionResponse: + type: object + description: Where to stream the generation run's progress and result. + properties: + workflow_id: + type: string + readOnly: true + description: Temporal workflow ID for tracking the process + sse_endpoint: + type: string + readOnly: true + description: SSE endpoint URL for real-time status updates + run_id: + type: string + format: uuid + readOnly: true + description: Identifies this run for reattaching to it or cancelling it. + required: + - run_id + - sse_endpoint + - workflow_id JobInput: type: object description: Serializer for individual job input data @@ -4932,11 +5714,57 @@ components: type: object description: 'Simple success acknowledgement body: `{"message": ...}`.' properties: - message: + message: + type: string + required: + - message + PaginatedBaseAgentList: + 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/BaseAgent' + PaginatedConnectionListList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: type: string - required: - - message - PaginatedBaseAgentList: + 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/ConnectionList' + PaginatedListAgentJobList: type: object required: - count @@ -4958,8 +5786,8 @@ components: results: type: array items: - $ref: '#/components/schemas/BaseAgent' - PaginatedConnectionListList: + $ref: '#/components/schemas/ListAgentJob' + PaginatedPolicyList: type: object required: - count @@ -4981,8 +5809,8 @@ components: results: type: array items: - $ref: '#/components/schemas/ConnectionList' - PaginatedListAgentJobList: + $ref: '#/components/schemas/Policy' + PaginatedPolicyVersionList: type: object required: - count @@ -5004,8 +5832,8 @@ components: results: type: array items: - $ref: '#/components/schemas/ListAgentJob' - PaginatedPolicyList: + $ref: '#/components/schemas/PolicyVersion' + PaginatedSkillSetList: type: object required: - count @@ -5027,8 +5855,8 @@ components: results: type: array items: - $ref: '#/components/schemas/Policy' - PaginatedPolicyVersionList: + $ref: '#/components/schemas/SkillSet' + PaginatedSkillSetVersionList: type: object required: - count @@ -5050,7 +5878,7 @@ components: results: type: array items: - $ref: '#/components/schemas/PolicyVersion' + $ref: '#/components/schemas/SkillSetVersion' PatchedAgentVersionUpdateRequest: type: object properties: @@ -5120,6 +5948,21 @@ components: maxLength: 255 description: type: string + PatchedUpdateSkillSetRequest: + type: object + description: Update skill set metadata (name, description, key) only. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + knowledge_base_key_id: + type: + - string + - 'null' + format: uuid Policy: type: object description: Policy serializer @@ -5320,6 +6163,15 @@ components: required: - status_code - timestamp + PublicSkillSetGeneration: + type: object + properties: + generation: + oneOf: + - $ref: '#/components/schemas/SkillSetGenerationRun' + - type: 'null' + required: + - generation QdrantCleanupErrorResponse: type: object description: 500 body when deleting an agent/version fails Qdrant collection @@ -5357,6 +6209,34 @@ components: * `pending` - Pending Review * `approved` - Approved * `rejected` - Rejected + SkillFile: + type: object + description: One markdown file (relative_path + content) inside a skill set + version. + properties: + relative_path: + type: string + maxLength: 1024 + content: + type: string + required: + - content + - relative_path + SkillFileRequest: + type: object + description: One markdown file (relative_path + content) inside a skill set + version. + properties: + relative_path: + type: string + minLength: 1 + maxLength: 1024 + content: + type: string + minLength: 1 + required: + - content + - relative_path SkillGenerationStateEnum: enum: - generating @@ -5365,6 +6245,186 @@ components: description: |- * `generating` - generating * `failed` - failed + SkillSet: + type: object + description: Skill set metadata (read). + properties: + id: + type: string + format: uuid + readOnly: true + name: + type: string + readOnly: true + description: + type: string + readOnly: true + organization_id: + type: string + format: uuid + readOnly: true + knowledge_base_key_id: + type: + - string + - 'null' + 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 + - description + - id + - knowledge_base_key_id + - name + - organization_id + - updated_at + SkillSetDeleteConflict: + type: object + description: 409 body when a skill set cannot be deleted because agents reference + it. + properties: + error: + type: string + dependent_agents: + type: array + items: + $ref: '#/components/schemas/SkillSetDependentAgentInfo' + required: + - dependent_agents + - error + SkillSetDependentAgentInfo: + type: object + description: An agent version that references a skill set (see get_agents_using_skill_set). + properties: + base_agent_id: + type: string + format: uuid + agent_name: + type: string + version_id: + type: string + format: uuid + version_name: + type: string + required: + - agent_name + - base_agent_id + - version_id + - version_name + SkillSetGenerationRun: + type: object + description: A generation already in flight, so a page can reattach to it. + properties: + workflow_id: + type: string + readOnly: true + description: Temporal workflow ID for tracking the process + sse_endpoint: + type: string + readOnly: true + description: SSE endpoint URL for real-time status updates + id: + type: string + format: uuid + readOnly: true + status: + type: string + readOnly: true + description: building, succeeded, or failed. + started_at: + type: string + format: date-time + readOnly: true + description: When the run started — the UI shows elapsed time from this. + required: + - id + - sse_endpoint + - started_at + - status + - workflow_id + SkillSetVersion: + type: object + description: Full skill set version (nested set + files) for read responses. + properties: + id: + type: string + format: uuid + readOnly: true + version_name: + type: string + maxLength: 255 + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + skill_set: + allOf: + - $ref: '#/components/schemas/SkillSet' + readOnly: true + created_by: + allOf: + - $ref: '#/components/schemas/SkillSetVersionCreatedBy' + readOnly: true + base_version_id: + type: + - string + - 'null' + format: uuid + readOnly: true + summary: + type: string + file_changes: {} + files: + type: array + items: + $ref: '#/components/schemas/SkillFile' + readOnly: true + required: + - base_version_id + - created_at + - created_by + - files + - id + - skill_set + - updated_at + - version_name + SkillSetVersionCreatedBy: + type: object + description: Minimal user serializer for audit metadata on skill set versions. + properties: + id: + type: integer + readOnly: true + email: + type: string + format: email + readOnly: true + title: Email address + display_name: + type: string + readOnly: true + required: + - display_name + - email + - id StatusEnum: enum: - active @@ -5681,6 +6741,8 @@ components: tested_at: type: string format: date-time + checks: + $ref: '#/components/schemas/ConnectionAuthenticationChecks' required: - message - success @@ -5789,6 +6851,49 @@ components: 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: diff --git a/openapi/wrappers.yml b/openapi/wrappers.yml index 4ab6b04..2dfd47e 100644 --- a/openapi/wrappers.yml +++ b/openapi/wrappers.yml @@ -1064,3 +1064,301 @@ apis: docstring: Return the currently-authenticated user. method: GET path: /v1/users/current_user/ + skill_sets: + class_name: SkillSetsAPI + docstring: Manage skill sets, immutable versions, and generation. + operations: + - kind: body + method_name: list + docstring: List skill sets. + method: GET + path: /v1/skills/ + endpoint_module: roe._generated.api.sdk.skill_sets_list + return_type: PaginatedSkillSetList + return_import: roe._generated.models.paginated_skill_set_list.PaginatedSkillSetList + inject_organization_id: true + parameters: + - name: ordering + location: query + wire_name: ordering + annotation: str | None + default: null + pass_unset_when_none: true + - 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 skill set with its initial base version. + method: POST + path: /v1/skills/ + endpoint_module: roe._generated.api.sdk.skill_sets_create + return_type: CreateSkillSet + return_import: roe._generated.models.create_skill_set.CreateSkillSet + body_format: dict + inject_organization_id: true + parameters: + - name: name + location: body + wire_name: name + annotation: str + - name: description + location: body + wire_name: description + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: retrieve + docstring: Retrieve skill-set metadata. + method: GET + path: /v1/skills/{id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_retrieve + return_type: SkillSet + return_import: roe._generated.models.skill_set.SkillSet + inject_organization_id: true + parameters: + - name: id + location: path + wire_name: id + annotation: str + - kind: body + method_name: update + docstring: Update skill-set metadata. + method: PATCH + path: /v1/skills/{id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_partial_update + return_type: UpdateSkillSet + return_import: roe._generated.models.update_skill_set.UpdateSkillSet + body_format: dict + inject_organization_id: true + parameters: + - name: id + location: path + wire_name: id + annotation: str + - name: name + location: body + wire_name: 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: delete + docstring: Delete a skill set and its versions unless referenced by agents. + method: DELETE + path: /v1/skills/{id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_destroy + inject_organization_id: true + parameters: + - name: id + location: path + wire_name: id + annotation: str + - kind: body + method_name: generate_version + docstring: Start asynchronous generation. Pass empty slices for unused tables and attachments. + method: POST + path: /v1/skills/{skill_set_id}/generate-version/ + endpoint_module: roe._generated.api.sdk.skill_sets_generate_version + return_type: GenerateSkillSetVersionResponse + return_import: roe._generated.models.generate_skill_set_version_response.GenerateSkillSetVersionResponse + body_format: dict + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_id + annotation: str + - name: use_case + location: body + wire_name: use_case + annotation: str + - name: base_version_id + location: body + wire_name: base_version_id + annotation: str | None + default: null + pass_unset_when_none: true + - name: auto_commit + location: body + wire_name: auto_commit + annotation: bool | None + default: null + pass_unset_when_none: true + - name: table_names + location: body + wire_name: table_names + annotation: list[str] | None + default: null + pass_unset_when_none: true + - name: attachments + location: body + wire_name: attachments + annotation: list[str] | None + default: null + pass_unset_when_none: true + - name: policy_id + location: body + wire_name: policy_id + annotation: str | None + default: null + pass_unset_when_none: true + - name: policy_version_id + location: body + wire_name: policy_version_id + annotation: str | None + default: null + pass_unset_when_none: true + - kind: body + method_name: get_generation + docstring: Read the tracked generation, or null when none exists. + method: GET + path: /v1/skills/{skill_set_id}/generation/ + endpoint_module: roe._generated.api.sdk.skill_sets_generation_retrieve + return_type: PublicSkillSetGeneration + return_import: roe._generated.models.public_skill_set_generation.PublicSkillSetGeneration + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_id + annotation: str + - kind: body + method_name: cancel_generation + docstring: Cancel and stop tracking a generation. + method: DELETE + path: /v1/skills/{skill_set_id}/generation/{run_id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_generation_cancel + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_id + annotation: str + - name: run_id + location: path + wire_name: run_id + annotation: str + - kind: body + method_name: set_current_version + docstring: Select the current version of a skill set. + method: PATCH + path: /v1/skills/{skill_set_id}/set-current-version/{version_id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_set_current_version + return_type: SkillSet + return_import: roe._generated.models.skill_set.SkillSet + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_id + annotation: str + - name: version_id + location: path + wire_name: version_id + annotation: str + - kind: body + method_name: list_versions + docstring: List versions of a skill set. + method: GET + path: /v1/skills/{skill_set_id}/versions/ + endpoint_module: roe._generated.api.sdk.skill_sets_versions_list + return_type: PaginatedSkillSetVersionList + return_import: roe._generated.models.paginated_skill_set_version_list.PaginatedSkillSetVersionList + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_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: Create a complete version and make it current. + method: POST + path: /v1/skills/{skill_set_id}/versions/ + endpoint_module: roe._generated.api.sdk.skill_sets_versions_create + return_type: CreateSkillSetVersion + return_import: roe._generated.models.create_skill_set_version.CreateSkillSetVersion + body_format: dict + inject_organization_id: true + parameters: + - name: skill_set_id + location: path + wire_name: skill_set_id + annotation: str + - name: files + location: body + wire_name: files + annotation: list[dict[str, Any]] + - name: version_name + location: body + wire_name: version_name + annotation: str | None + default: null + pass_unset_when_none: true + - name: base_version_id + location: body + wire_name: base_version_id + annotation: str | None + default: null + pass_unset_when_none: true + - name: summary + location: body + wire_name: summary + annotation: str | None + default: null + pass_unset_when_none: true + - name: file_changes + location: body + wire_name: file_changes + annotation: list[dict[str, Any]] | None + default: null + pass_unset_when_none: true + - kind: body + method_name: retrieve_version + docstring: Read a version and its complete file collection. + method: GET + path: /v1/skills/versions/{id}/ + endpoint_module: roe._generated.api.sdk.skill_sets_versions_retrieve + return_type: SkillSetVersion + return_import: roe._generated.models.skill_set_version.SkillSetVersion + inject_organization_id: true + parameters: + - name: id + location: path + wire_name: id + annotation: str diff --git a/pyproject.toml b/pyproject.toml index 8dcbf20..235cc9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "roe-ai" -version = "1.1.14" +version = "1.1.15" authors = [ { name = "Roe", email = "founders@roe-ai.com" }, ] diff --git a/src/roe/_generated/api/agents/agents_list.py b/src/roe/_generated/api/agents/agents_list.py index f5abf3b..5082919 100644 --- a/src/roe/_generated/api/agents/agents_list.py +++ b/src/roe/_generated/api/agents/agents_list.py @@ -9,6 +9,7 @@ from ... import errors from ...models.agents_list_response_400 import AgentsListResponse400 +from ...models.agents_list_tags_match import AgentsListTagsMatch from ...models.error_detail_response import ErrorDetailResponse from ...models.paginated_base_agent_list import PaginatedBaseAgentList from ...types import UNSET, Unset @@ -39,6 +40,7 @@ def _get_kwargs( page_size: int | Unset = UNSET, search: str | Unset = UNSET, tags: list[str] | Unset = UNSET, + tags_match: AgentsListTagsMatch | Unset = UNSET, updated_from: datetime.datetime | Unset = UNSET, updated_to: datetime.datetime | Unset = UNSET, @@ -113,6 +115,12 @@ def _get_kwargs( params["tags"] = json_tags + json_tags_match: str | Unset = UNSET + if not isinstance(tags_match, Unset): + json_tags_match = tags_match.value + + params["tags_match"] = json_tags_match + json_updated_from: str | Unset = UNSET if not isinstance(updated_from, Unset): json_updated_from = updated_from.isoformat() @@ -203,6 +211,7 @@ def sync_detailed( page_size: int | Unset = UNSET, search: str | Unset = UNSET, tags: list[str] | Unset = UNSET, + tags_match: AgentsListTagsMatch | Unset = UNSET, updated_from: datetime.datetime | Unset = UNSET, updated_to: datetime.datetime | Unset = UNSET, @@ -230,6 +239,7 @@ def sync_detailed( page_size (int | Unset): search (str | Unset): tags (list[str] | Unset): + tags_match (AgentsListTagsMatch | Unset): updated_from (datetime.datetime | Unset): updated_to (datetime.datetime | Unset): @@ -261,6 +271,7 @@ def sync_detailed( page_size=page_size, search=search, tags=tags, +tags_match=tags_match, updated_from=updated_from, updated_to=updated_to, @@ -293,6 +304,7 @@ def sync( page_size: int | Unset = UNSET, search: str | Unset = UNSET, tags: list[str] | Unset = UNSET, + tags_match: AgentsListTagsMatch | Unset = UNSET, updated_from: datetime.datetime | Unset = UNSET, updated_to: datetime.datetime | Unset = UNSET, @@ -320,6 +332,7 @@ def sync( page_size (int | Unset): search (str | Unset): tags (list[str] | Unset): + tags_match (AgentsListTagsMatch | Unset): updated_from (datetime.datetime | Unset): updated_to (datetime.datetime | Unset): @@ -352,6 +365,7 @@ def sync( page_size=page_size, search=search, tags=tags, +tags_match=tags_match, updated_from=updated_from, updated_to=updated_to, @@ -378,6 +392,7 @@ async def asyncio_detailed( page_size: int | Unset = UNSET, search: str | Unset = UNSET, tags: list[str] | Unset = UNSET, + tags_match: AgentsListTagsMatch | Unset = UNSET, updated_from: datetime.datetime | Unset = UNSET, updated_to: datetime.datetime | Unset = UNSET, @@ -405,6 +420,7 @@ async def asyncio_detailed( page_size (int | Unset): search (str | Unset): tags (list[str] | Unset): + tags_match (AgentsListTagsMatch | Unset): updated_from (datetime.datetime | Unset): updated_to (datetime.datetime | Unset): @@ -436,6 +452,7 @@ async def asyncio_detailed( page_size=page_size, search=search, tags=tags, +tags_match=tags_match, updated_from=updated_from, updated_to=updated_to, @@ -468,6 +485,7 @@ async def asyncio( page_size: int | Unset = UNSET, search: str | Unset = UNSET, tags: list[str] | Unset = UNSET, + tags_match: AgentsListTagsMatch | Unset = UNSET, updated_from: datetime.datetime | Unset = UNSET, updated_to: datetime.datetime | Unset = UNSET, @@ -495,6 +513,7 @@ async def asyncio( page_size (int | Unset): search (str | Unset): tags (list[str] | Unset): + tags_match (AgentsListTagsMatch | Unset): updated_from (datetime.datetime | Unset): updated_to (datetime.datetime | Unset): @@ -527,6 +546,7 @@ async def asyncio( page_size=page_size, search=search, tags=tags, +tags_match=tags_match, updated_from=updated_from, updated_to=updated_to, diff --git a/src/roe/_generated/api/sdk/__init__.py b/src/roe/_generated/api/sdk/__init__.py new file mode 100644 index 0000000..c9921b5 --- /dev/null +++ b/src/roe/_generated/api/sdk/__init__.py @@ -0,0 +1 @@ +""" Contains endpoint functions for accessing the API """ diff --git a/src/roe/_generated/api/sdk/skill_sets_create.py b/src/roe/_generated/api/sdk/skill_sets_create.py new file mode 100644 index 0000000..d4309eb --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_create.py @@ -0,0 +1,232 @@ +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.create_skill_set import CreateSkillSet +from ...models.create_skill_set_request import CreateSkillSetRequest +from ...models.skill_sets_create_response_400 import SkillSetsCreateResponse400 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + *, + body: CreateSkillSetRequest, + 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/skills/", + "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) -> CreateSkillSet | SkillSetsCreateResponse400 | None: + if response.status_code == 201: + response_201 = CreateSkillSet.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + response_400 = SkillSetsCreateResponse400.from_dict(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[CreateSkillSet | SkillSetsCreateResponse400]: + 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: CreateSkillSetRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[CreateSkillSet | SkillSetsCreateResponse400]: + """ List the org's skill sets and create a new one. + + Args: + organization_id (UUID | Unset): + body (CreateSkillSetRequest): Create a new skill set. Its version 0 is always the base + skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + 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[CreateSkillSet | SkillSetsCreateResponse400] + """ + + + 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: CreateSkillSetRequest, + organization_id: UUID | Unset = UNSET, + +) -> CreateSkillSet | SkillSetsCreateResponse400 | None: + """ List the org's skill sets and create a new one. + + Args: + organization_id (UUID | Unset): + body (CreateSkillSetRequest): Create a new skill set. Its version 0 is always the base + skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + 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: + CreateSkillSet | SkillSetsCreateResponse400 + """ + + + return sync_detailed( + client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + body: CreateSkillSetRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[CreateSkillSet | SkillSetsCreateResponse400]: + """ List the org's skill sets and create a new one. + + Args: + organization_id (UUID | Unset): + body (CreateSkillSetRequest): Create a new skill set. Its version 0 is always the base + skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + 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[CreateSkillSet | SkillSetsCreateResponse400] + """ + + + 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: CreateSkillSetRequest, + organization_id: UUID | Unset = UNSET, + +) -> CreateSkillSet | SkillSetsCreateResponse400 | None: + """ List the org's skill sets and create a new one. + + Args: + organization_id (UUID | Unset): + body (CreateSkillSetRequest): Create a new skill set. Its version 0 is always the base + skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + 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: + CreateSkillSet | SkillSetsCreateResponse400 + """ + + + return (await asyncio_detailed( + client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_destroy.py b/src/roe/_generated/api/sdk/skill_sets_destroy.py new file mode 100644 index 0000000..b17844b --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_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 ...models.skill_set_delete_conflict import SkillSetDeleteConflict +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + 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/skills/{id}/".format(id=quote(str(id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Any | ErrorDetailResponse | SkillSetDeleteConflict | 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 response.status_code == 409: + response_409 = SkillSetDeleteConflict.from_dict(response.json()) + + + + return response_409 + + 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 | SkillSetDeleteConflict]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse | SkillSetDeleteConflict]: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSetDeleteConflict] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | SkillSetDeleteConflict | None: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSetDeleteConflict + """ + + + return sync_detailed( + id=id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse | SkillSetDeleteConflict]: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSetDeleteConflict] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | SkillSetDeleteConflict | None: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSetDeleteConflict + """ + + + return (await asyncio_detailed( + id=id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_generate_version.py b/src/roe/_generated/api/sdk/skill_sets_generate_version.py new file mode 100644 index 0000000..5f89ec2 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_generate_version.py @@ -0,0 +1,297 @@ +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.generate_skill_set_version_request import GenerateSkillSetVersionRequest +from ...models.generate_skill_set_version_response import GenerateSkillSetVersionResponse +from ...models.skill_sets_generate_version_response_400 import SkillSetsGenerateVersionResponse400 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + skill_set_id: UUID, + *, + body: GenerateSkillSetVersionRequest, + 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/skills/{skill_set_id}/generate-version/".format(skill_set_id=quote(str(skill_set_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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400 | None: + if response.status_code == 200: + response_200 = GenerateSkillSetVersionResponse.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 400: + response_400 = SkillSetsGenerateVersionResponse400.from_dict(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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: GenerateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400]: + """ Author the next version of a skill set with an agent. + + Starts the generation workflow and returns where to stream it. The agent + reads the customer's use case, profiles the linked tables, reads the + attached CSVs and documents, and rewrites the customer layer of the skill. + + By default nothing is written here: the generated file set comes back for + review and is saved through the normal version-create path. With + ``auto_commit`` the workflow saves it through that same path on success. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (GenerateSkillSetVersionRequest): Request to author the next version of a skill set + with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + + 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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: GenerateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400 | None: + """ Author the next version of a skill set with an agent. + + Starts the generation workflow and returns where to stream it. The agent + reads the customer's use case, profiles the linked tables, reads the + attached CSVs and documents, and rewrites the customer layer of the skill. + + By default nothing is written here: the generated file set comes back for + review and is saved through the normal version-create path. With + ``auto_commit`` the workflow saves it through that same path on success. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (GenerateSkillSetVersionRequest): Request to author the next version of a skill set + with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + + 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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400 + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: GenerateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400]: + """ Author the next version of a skill set with an agent. + + Starts the generation workflow and returns where to stream it. The agent + reads the customer's use case, profiles the linked tables, reads the + attached CSVs and documents, and rewrites the customer layer of the skill. + + By default nothing is written here: the generated file set comes back for + review and is saved through the normal version-create path. With + ``auto_commit`` the workflow saves it through that same path on success. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (GenerateSkillSetVersionRequest): Request to author the next version of a skill set + with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + + 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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: GenerateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400 | None: + """ Author the next version of a skill set with an agent. + + Starts the generation workflow and returns where to stream it. The agent + reads the customer's use case, profiles the linked tables, reads the + attached CSVs and documents, and rewrites the customer layer of the skill. + + By default nothing is written here: the generated file set comes back for + review and is saved through the normal version-create path. With + ``auto_commit`` the workflow saves it through that same path on success. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (GenerateSkillSetVersionRequest): Request to author the next version of a skill set + with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + + 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 | GenerateSkillSetVersionResponse | SkillSetsGenerateVersionResponse400 + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_generation_cancel.py b/src/roe/_generated/api/sdk/skill_sets_generation_cancel.py new file mode 100644 index 0000000..5bc0f72 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_generation_cancel.py @@ -0,0 +1,233 @@ +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( + skill_set_id: UUID, + 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": "delete", + "url": "/v1/skills/{skill_set_id}/generation/{run_id}/".format(skill_set_id=quote(str(skill_set_id), safe=""),run_id=quote(str(run_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 response.status_code == 502: + response_502 = ErrorDetailResponse.from_dict(response.json()) + + + + return response_502 + + 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( + skill_set_id: UUID, + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse]: + """ Stop tracking a generation, cancelling it if it is still running + + Used when the operator cancels, when a finished draft has been loaded into the editor, and when a + run turns out to be unrecoverable. Cancelling a run that already finished is harmless. + + Args: + skill_set_id (UUID): + 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[Any | ErrorDetailResponse] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +run_id=run_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + skill_set_id: UUID, + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | None: + """ Stop tracking a generation, cancelling it if it is still running + + Used when the operator cancels, when a finished draft has been loaded into the editor, and when a + run turns out to be unrecoverable. Cancelling a run that already finished is harmless. + + Args: + skill_set_id (UUID): + 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: + Any | ErrorDetailResponse + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +run_id=run_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[Any | ErrorDetailResponse]: + """ Stop tracking a generation, cancelling it if it is still running + + Used when the operator cancels, when a finished draft has been loaded into the editor, and when a + run turns out to be unrecoverable. Cancelling a run that already finished is harmless. + + Args: + skill_set_id (UUID): + 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[Any | ErrorDetailResponse] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +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( + skill_set_id: UUID, + run_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Any | ErrorDetailResponse | None: + """ Stop tracking a generation, cancelling it if it is still running + + Used when the operator cancels, when a finished draft has been loaded into the editor, and when a + run turns out to be unrecoverable. Cancelling a run that already finished is harmless. + + Args: + skill_set_id (UUID): + 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: + Any | ErrorDetailResponse + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +run_id=run_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_generation_retrieve.py b/src/roe/_generated/api/sdk/skill_sets_generation_retrieve.py new file mode 100644 index 0000000..273efcc --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_generation_retrieve.py @@ -0,0 +1,197 @@ +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.public_skill_set_generation import PublicSkillSetGeneration +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + skill_set_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/skills/{skill_set_id}/generation/".format(skill_set_id=quote(str(skill_set_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PublicSkillSetGeneration | None: + if response.status_code == 200: + response_200 = PublicSkillSetGeneration.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[PublicSkillSetGeneration]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[PublicSkillSetGeneration]: + """ Returns the last generation and its status, or generation: null when no run exists. + + Args: + skill_set_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[PublicSkillSetGeneration] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> PublicSkillSetGeneration | None: + """ Returns the last generation and its status, or generation: null when no run exists. + + Args: + skill_set_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: + PublicSkillSetGeneration + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[PublicSkillSetGeneration]: + """ Returns the last generation and its status, or generation: null when no run exists. + + Args: + skill_set_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[PublicSkillSetGeneration] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> PublicSkillSetGeneration | None: + """ Returns the last generation and its status, or generation: null when no run exists. + + Args: + skill_set_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: + PublicSkillSetGeneration + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_list.py b/src/roe/_generated/api/sdk/skill_sets_list.py new file mode 100644 index 0000000..b01f8d9 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_list.py @@ -0,0 +1,244 @@ +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_skill_set_list import PaginatedSkillSetList +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + *, + ordering: str | 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] = {} + + params["ordering"] = ordering + + 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/skills/", + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PaginatedSkillSetList | None: + if response.status_code == 200: + response_200 = PaginatedSkillSetList.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[PaginatedSkillSetList]: + 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, + ordering: str | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedSkillSetList]: + """ List the org's skill sets and create a new one. + + Args: + ordering (str | 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[PaginatedSkillSetList] + """ + + + kwargs = _get_kwargs( + ordering=ordering, +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, + ordering: str | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedSkillSetList | None: + """ List the org's skill sets and create a new one. + + Args: + ordering (str | 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: + PaginatedSkillSetList + """ + + + return sync_detailed( + client=client, +ordering=ordering, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + ordering: str | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedSkillSetList]: + """ List the org's skill sets and create a new one. + + Args: + ordering (str | 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[PaginatedSkillSetList] + """ + + + kwargs = _get_kwargs( + ordering=ordering, +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, + ordering: str | Unset = UNSET, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + search: str | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedSkillSetList | None: + """ List the org's skill sets and create a new one. + + Args: + ordering (str | 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: + PaginatedSkillSetList + """ + + + return (await asyncio_detailed( + client=client, +ordering=ordering, +page=page, +page_size=page_size, +search=search, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_partial_update.py b/src/roe/_generated/api/sdk/skill_sets_partial_update.py new file mode 100644 index 0000000..96a2973 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_partial_update.py @@ -0,0 +1,223 @@ +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.patched_update_skill_set_request import PatchedUpdateSkillSetRequest +from ...models.update_skill_set import UpdateSkillSet +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + id: UUID, + *, + body: PatchedUpdateSkillSetRequest | 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/skills/{id}/".format(id=quote(str(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) -> UpdateSkillSet | None: + if response.status_code == 200: + response_200 = UpdateSkillSet.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[UpdateSkillSet]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: UUID, + *, + client: AuthenticatedClient, + body: PatchedUpdateSkillSetRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[UpdateSkillSet]: + """ Retrieve, update, or delete a single skill set. + + Args: + id (UUID): + organization_id (UUID | Unset): + body (PatchedUpdateSkillSetRequest | Unset): Update skill set metadata (name, description, + key) only. + + 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[UpdateSkillSet] + """ + + + kwargs = _get_kwargs( + id=id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: UUID, + *, + client: AuthenticatedClient, + body: PatchedUpdateSkillSetRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> UpdateSkillSet | None: + """ Retrieve, update, or delete a single skill set. + + Args: + id (UUID): + organization_id (UUID | Unset): + body (PatchedUpdateSkillSetRequest | Unset): Update skill set metadata (name, description, + key) only. + + 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: + UpdateSkillSet + """ + + + return sync_detailed( + id=id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + id: UUID, + *, + client: AuthenticatedClient, + body: PatchedUpdateSkillSetRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[UpdateSkillSet]: + """ Retrieve, update, or delete a single skill set. + + Args: + id (UUID): + organization_id (UUID | Unset): + body (PatchedUpdateSkillSetRequest | Unset): Update skill set metadata (name, description, + key) only. + + 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[UpdateSkillSet] + """ + + + kwargs = _get_kwargs( + id=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( + id: UUID, + *, + client: AuthenticatedClient, + body: PatchedUpdateSkillSetRequest | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> UpdateSkillSet | None: + """ Retrieve, update, or delete a single skill set. + + Args: + id (UUID): + organization_id (UUID | Unset): + body (PatchedUpdateSkillSetRequest | Unset): Update skill set metadata (name, description, + key) only. + + 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: + UpdateSkillSet + """ + + + return (await asyncio_detailed( + id=id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_retrieve.py b/src/roe/_generated/api/sdk/skill_sets_retrieve.py new file mode 100644 index 0000000..fe09400 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_retrieve.py @@ -0,0 +1,205 @@ +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.skill_set import SkillSet +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + 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/skills/{id}/".format(id=quote(str(id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorDetailResponse | SkillSet | None: + if response.status_code == 200: + response_200 = SkillSet.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 | SkillSet]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | SkillSet]: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSet] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | SkillSet | None: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSet + """ + + + return sync_detailed( + id=id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[ErrorDetailResponse | SkillSet]: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSet] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> ErrorDetailResponse | SkillSet | None: + """ Retrieve, update, or delete a single skill set. + + Args: + 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 | SkillSet + """ + + + return (await asyncio_detailed( + id=id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_set_current_version.py b/src/roe/_generated/api/sdk/skill_sets_set_current_version.py new file mode 100644 index 0000000..489f8fb --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_set_current_version.py @@ -0,0 +1,210 @@ +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.skill_set import SkillSet +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + skill_set_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": "patch", + "url": "/v1/skills/{skill_set_id}/set-current-version/{version_id}/".format(skill_set_id=quote(str(skill_set_id), safe=""),version_id=quote(str(version_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> SkillSet | None: + if response.status_code == 200: + response_200 = SkillSet.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[SkillSet]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + skill_set_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[SkillSet]: + """ Point a skill set at a specific version (set-current / rollback). + + Args: + skill_set_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[SkillSet] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> SkillSet | None: + """ Point a skill set at a specific version (set-current / rollback). + + Args: + skill_set_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: + SkillSet + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[SkillSet]: + """ Point a skill set at a specific version (set-current / rollback). + + Args: + skill_set_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[SkillSet] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + version_id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> SkillSet | None: + """ Point a skill set at a specific version (set-current / rollback). + + Args: + skill_set_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: + SkillSet + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +version_id=version_id, +client=client, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_versions_create.py b/src/roe/_generated/api/sdk/skill_sets_versions_create.py new file mode 100644 index 0000000..7195c6c --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_versions_create.py @@ -0,0 +1,233 @@ +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.create_skill_set_version import CreateSkillSetVersion +from ...models.create_skill_set_version_request import CreateSkillSetVersionRequest +from ...models.error_detail_response import ErrorDetailResponse +from ...models.skill_sets_versions_create_response_400 import SkillSetsVersionsCreateResponse400 +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + skill_set_id: UUID, + *, + body: CreateSkillSetVersionRequest, + 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/skills/{skill_set_id}/versions/".format(skill_set_id=quote(str(skill_set_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) -> CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400 | None: + if response.status_code == 201: + response_201 = CreateSkillSetVersion.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + response_400 = SkillSetsVersionsCreateResponse400.from_dict(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[CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: CreateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400]: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (CreateSkillSetVersionRequest): Create a new (full) version of an existing skill set. + + 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[CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_id, +body=body, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: CreateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400 | None: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (CreateSkillSetVersionRequest): Create a new (full) version of an existing skill set. + + 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: + CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400 + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +client=client, +body=body, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: CreateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> Response[CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400]: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (CreateSkillSetVersionRequest): Create a new (full) version of an existing skill set. + + 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[CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + body: CreateSkillSetVersionRequest, + organization_id: UUID | Unset = UNSET, + +) -> CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400 | None: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_id (UUID): + organization_id (UUID | Unset): + body (CreateSkillSetVersionRequest): Create a new (full) version of an existing skill set. + + 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: + CreateSkillSetVersion | ErrorDetailResponse | SkillSetsVersionsCreateResponse400 + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +client=client, +body=body, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_versions_list.py b/src/roe/_generated/api/sdk/skill_sets_versions_list.py new file mode 100644 index 0000000..467555e --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_versions_list.py @@ -0,0 +1,227 @@ +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_skill_set_version_list import PaginatedSkillSetVersionList +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + skill_set_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/skills/{skill_set_id}/versions/".format(skill_set_id=quote(str(skill_set_id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> PaginatedSkillSetVersionList | None: + if response.status_code == 200: + response_200 = PaginatedSkillSetVersionList.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[PaginatedSkillSetVersionList]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedSkillSetVersionList]: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_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[PaginatedSkillSetVersionList] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedSkillSetVersionList | None: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_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: + PaginatedSkillSetVersionList + """ + + + return sync_detailed( + skill_set_id=skill_set_id, +client=client, +page=page, +page_size=page_size, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> Response[PaginatedSkillSetVersionList]: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_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[PaginatedSkillSetVersionList] + """ + + + kwargs = _get_kwargs( + skill_set_id=skill_set_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( + skill_set_id: UUID, + *, + client: AuthenticatedClient, + page: int | Unset = UNSET, + page_size: int | Unset = UNSET, + organization_id: UUID | Unset = UNSET, + +) -> PaginatedSkillSetVersionList | None: + """ List a skill set's versions, or create a new version. + + Args: + skill_set_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: + PaginatedSkillSetVersionList + """ + + + return (await asyncio_detailed( + skill_set_id=skill_set_id, +client=client, +page=page, +page_size=page_size, +organization_id=organization_id, + + )).parsed diff --git a/src/roe/_generated/api/sdk/skill_sets_versions_retrieve.py b/src/roe/_generated/api/sdk/skill_sets_versions_retrieve.py new file mode 100644 index 0000000..fa69595 --- /dev/null +++ b/src/roe/_generated/api/sdk/skill_sets_versions_retrieve.py @@ -0,0 +1,197 @@ +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.skill_set_version import SkillSetVersion +from ...types import UNSET, Unset +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + 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/skills/versions/{id}/".format(id=quote(str(id), safe=""),), + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> SkillSetVersion | None: + if response.status_code == 200: + response_200 = SkillSetVersion.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[SkillSetVersion]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[SkillSetVersion]: + """ Retrieve a version by its id, or by a set id (-> that set's current version). + + Args: + 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[SkillSetVersion] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> SkillSetVersion | None: + """ Retrieve a version by its id, or by a set id (-> that set's current version). + + Args: + 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: + SkillSetVersion + """ + + + return sync_detailed( + id=id, +client=client, +organization_id=organization_id, + + ).parsed + +async def asyncio_detailed( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> Response[SkillSetVersion]: + """ Retrieve a version by its id, or by a set id (-> that set's current version). + + Args: + 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[SkillSetVersion] + """ + + + kwargs = _get_kwargs( + id=id, +organization_id=organization_id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: UUID, + *, + client: AuthenticatedClient, + organization_id: UUID | Unset = UNSET, + +) -> SkillSetVersion | None: + """ Retrieve a version by its id, or by a set id (-> that set's current version). + + Args: + 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: + SkillSetVersion + """ + + + return (await asyncio_detailed( + id=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 ca876f3..4e1fa79 100644 --- a/src/roe/_generated/models/__init__.py +++ b/src/roe/_generated/models/__init__.py @@ -31,6 +31,7 @@ from .agents_jobs_results_create_response_400 import AgentsJobsResultsCreateResponse400 from .agents_jobs_statuses_create_response_400 import AgentsJobsStatusesCreateResponse400 from .agents_list_response_400 import AgentsListResponse400 +from .agents_list_tags_match import AgentsListTagsMatch from .agents_partial_update_response_400 import AgentsPartialUpdateResponse400 from .agents_run_async_create_response_400_type_1 import AgentsRunAsyncCreateResponse400Type1 from .agents_run_async_create_response_400_type_2 import AgentsRunAsyncCreateResponse400Type2 @@ -51,6 +52,9 @@ from .color_enum import ColorEnum from .connection import Connection from .connection_auth_config import ConnectionAuthConfig +from .connection_authentication_check import ConnectionAuthenticationCheck +from .connection_authentication_check_status_enum import ConnectionAuthenticationCheckStatusEnum +from .connection_authentication_checks import ConnectionAuthenticationChecks from .connection_delete_error_response import ConnectionDeleteErrorResponse from .connection_dynamic_inputs import ConnectionDynamicInputs from .connection_list import ConnectionList @@ -64,6 +68,8 @@ from .connections_test_credentials_create_response_400_type_1 import ConnectionsTestCredentialsCreateResponse400Type1 from .connections_update_response_400_type_1 import ConnectionsUpdateResponse400Type1 from .connections_update_response_400_type_2 import ConnectionsUpdateResponse400Type2 +from .connector_browser_session import ConnectorBrowserSession +from .connector_browser_session_required_config import ConnectorBrowserSessionRequiredConfig from .connector_list_response import ConnectorListResponse from .connector_metadata import ConnectorMetadata from .connector_metadata_dynamic_input_fields import ConnectorMetadataDynamicInputFields @@ -76,11 +82,19 @@ from .create_policy_request import CreatePolicyRequest from .create_policy_version import CreatePolicyVersion from .create_policy_version_request import CreatePolicyVersionRequest +from .create_skill_set import CreateSkillSet +from .create_skill_set_request import CreateSkillSetRequest +from .create_skill_set_version import CreateSkillSetVersion +from .create_skill_set_version_file_changes_item import CreateSkillSetVersionFileChangesItem +from .create_skill_set_version_request import CreateSkillSetVersionRequest +from .create_skill_set_version_request_file_changes_item import CreateSkillSetVersionRequestFileChangesItem from .dependent_agent_info import DependentAgentInfo from .discovery_supported_models_list_response_400 import DiscoverySupportedModelsListResponse400 from .duplicate_connection_existing import DuplicateConnectionExisting from .duplicate_connection_response import DuplicateConnectionResponse from .error_detail_response import ErrorDetailResponse +from .generate_skill_set_version_request import GenerateSkillSetVersionRequest +from .generate_skill_set_version_response import GenerateSkillSetVersionResponse from .job_input import JobInput from .list_agent_job import ListAgentJob from .list_agent_job_metadata import ListAgentJobMetadata @@ -90,6 +104,8 @@ from .paginated_list_agent_job_list import PaginatedListAgentJobList from .paginated_policy_list import PaginatedPolicyList from .paginated_policy_version_list import PaginatedPolicyVersionList +from .paginated_skill_set_list import PaginatedSkillSetList +from .paginated_skill_set_version_list import PaginatedSkillSetVersionList from .patched_agent_version_update_request import PatchedAgentVersionUpdateRequest from .patched_base_agent_update_request import PatchedBaseAgentUpdateRequest from .patched_update_connection_request import PatchedUpdateConnectionRequest @@ -97,6 +113,7 @@ from .patched_update_connection_request_config import PatchedUpdateConnectionRequestConfig 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 .policies_create_response_400 import PoliciesCreateResponse400 from .policies_partial_update_response_400 import PoliciesPartialUpdateResponse400 from .policies_update_response_400 import PoliciesUpdateResponse400 @@ -111,10 +128,22 @@ from .post_action_spec_request_param_mappings import PostActionSpecRequestParamMappings from .public_agent_job_status_event import PublicAgentJobStatusEvent from .public_agent_job_status_event_error_details import PublicAgentJobStatusEventErrorDetails +from .public_skill_set_generation import PublicSkillSetGeneration from .qdrant_cleanup_error_response import QdrantCleanupErrorResponse from .resend_agent_job_webhook_request import ResendAgentJobWebhookRequest from .review_status_enum import ReviewStatusEnum +from .skill_file import SkillFile +from .skill_file_request import SkillFileRequest from .skill_generation_state_enum import SkillGenerationStateEnum +from .skill_set import SkillSet +from .skill_set_delete_conflict import SkillSetDeleteConflict +from .skill_set_dependent_agent_info import SkillSetDependentAgentInfo +from .skill_set_generation_run import SkillSetGenerationRun +from .skill_set_version import SkillSetVersion +from .skill_set_version_created_by import SkillSetVersionCreatedBy +from .skill_sets_create_response_400 import SkillSetsCreateResponse400 +from .skill_sets_generate_version_response_400 import SkillSetsGenerateVersionResponse400 +from .skill_sets_versions_create_response_400 import SkillSetsVersionsCreateResponse400 from .status_enum import StatusEnum from .supported_llm_model import SupportedLLMModel from .supported_llm_model_list import SupportedLLMModelList @@ -146,6 +175,7 @@ from .update_connection_request_dynamic_inputs import UpdateConnectionRequestDynamicInputs from .update_policy import UpdatePolicy from .update_policy_request import UpdatePolicyRequest +from .update_skill_set import UpdateSkillSet from .upload_table_response_400_type_1 import UploadTableResponse400Type1 from .upload_table_response_400_type_2 import UploadTableResponse400Type2 from .user import User @@ -179,6 +209,7 @@ "AgentsJobsResultsCreateResponse400", "AgentsJobsStatusesCreateResponse400", "AgentsListResponse400", + "AgentsListTagsMatch", "AgentsPartialUpdateResponse400", "AgentsRunAsyncCreateResponse400Type1", "AgentsRunAsyncCreateResponse400Type2", @@ -203,6 +234,9 @@ "ColorEnum", "Connection", "ConnectionAuthConfig", + "ConnectionAuthenticationCheck", + "ConnectionAuthenticationChecks", + "ConnectionAuthenticationCheckStatusEnum", "ConnectionDeleteErrorResponse", "ConnectionDynamicInputs", "ConnectionList", @@ -216,6 +250,8 @@ "ConnectionsTestCredentialsCreateResponse400Type1", "ConnectionsUpdateResponse400Type1", "ConnectionsUpdateResponse400Type2", + "ConnectorBrowserSession", + "ConnectorBrowserSessionRequiredConfig", "ConnectorListResponse", "ConnectorMetadata", "ConnectorMetadataDynamicInputFields", @@ -228,11 +264,19 @@ "CreatePolicyRequest", "CreatePolicyVersion", "CreatePolicyVersionRequest", + "CreateSkillSet", + "CreateSkillSetRequest", + "CreateSkillSetVersion", + "CreateSkillSetVersionFileChangesItem", + "CreateSkillSetVersionRequest", + "CreateSkillSetVersionRequestFileChangesItem", "DependentAgentInfo", "DiscoverySupportedModelsListResponse400", "DuplicateConnectionExisting", "DuplicateConnectionResponse", "ErrorDetailResponse", + "GenerateSkillSetVersionRequest", + "GenerateSkillSetVersionResponse", "JobInput", "ListAgentJob", "ListAgentJobMetadata", @@ -242,6 +286,8 @@ "PaginatedListAgentJobList", "PaginatedPolicyList", "PaginatedPolicyVersionList", + "PaginatedSkillSetList", + "PaginatedSkillSetVersionList", "PatchedAgentVersionUpdateRequest", "PatchedBaseAgentUpdateRequest", "PatchedUpdateConnectionRequest", @@ -249,6 +295,7 @@ "PatchedUpdateConnectionRequestConfig", "PatchedUpdateConnectionRequestDynamicInputs", "PatchedUpdatePolicyRequest", + "PatchedUpdateSkillSetRequest", "PoliciesCreateResponse400", "PoliciesPartialUpdateResponse400", "PoliciesUpdateResponse400", @@ -263,10 +310,22 @@ "PostActionSpecRequestParamMappings", "PublicAgentJobStatusEvent", "PublicAgentJobStatusEventErrorDetails", + "PublicSkillSetGeneration", "QdrantCleanupErrorResponse", "ResendAgentJobWebhookRequest", "ReviewStatusEnum", + "SkillFile", + "SkillFileRequest", "SkillGenerationStateEnum", + "SkillSet", + "SkillSetDeleteConflict", + "SkillSetDependentAgentInfo", + "SkillSetGenerationRun", + "SkillSetsCreateResponse400", + "SkillSetsGenerateVersionResponse400", + "SkillSetsVersionsCreateResponse400", + "SkillSetVersion", + "SkillSetVersionCreatedBy", "StatusEnum", "SupportedLLMModel", "SupportedLLMModelList", @@ -298,6 +357,7 @@ "UpdateConnectionRequestDynamicInputs", "UpdatePolicy", "UpdatePolicyRequest", + "UpdateSkillSet", "UploadTableResponse400Type1", "UploadTableResponse400Type2", "User", diff --git a/src/roe/_generated/models/agent_tag.py b/src/roe/_generated/models/agent_tag.py index c9b6e0a..f7c7b31 100644 --- a/src/roe/_generated/models/agent_tag.py +++ b/src/roe/_generated/models/agent_tag.py @@ -41,6 +41,7 @@ class AgentTag: created_at (datetime.datetime): creator (int | None): usage_count (int): Count of agents using this tag + private (bool): Visible only to its owner (the Pinned group). """ id: UUID @@ -49,6 +50,7 @@ class AgentTag: created_at: datetime.datetime creator: int | None usage_count: int + private: bool additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -69,6 +71,8 @@ def to_dict(self) -> dict[str, Any]: usage_count = self.usage_count + private = self.private + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -79,6 +83,7 @@ def to_dict(self) -> dict[str, Any]: "created_at": created_at, "creator": creator, "usage_count": usage_count, + "private": private, }) return field_dict @@ -115,6 +120,8 @@ def _parse_creator(data: object) -> int | None: usage_count = d.pop("usage_count") + private = d.pop("private") + agent_tag = cls( id=id, name=name, @@ -122,6 +129,7 @@ def _parse_creator(data: object) -> int | None: created_at=created_at, creator=creator, usage_count=usage_count, + private=private, ) diff --git a/src/roe/_generated/models/agent_version.py b/src/roe/_generated/models/agent_version.py index 1949edd..dcbb7ef 100644 --- a/src/roe/_generated/models/agent_version.py +++ b/src/roe/_generated/models/agent_version.py @@ -41,7 +41,9 @@ class AgentVersion: engine_name (str): Engine Display Name supports_memory (bool): True when this engine has a built-in memory profile, so memory profiles can be configured on it. Independent of whether memory is currently switched on. - input_definitions (list[AgentInputDefinition]): List of input definitions for this agent version. + input_definitions (list[AgentInputDefinition]): List of input definitions for this agent version. Engines with + fixed job inputs (the policy-aware investigation engines) accept only the keys they declare; any additional key + is rejected. Per-case detail belongs inside the value of an accepted field, which is free text. engine_config (Any): Engine configuration. post_actions (list[PostActionSpec]): Connector write actions configured on this version. organization_id (UUID): Organization ID from base_agent. diff --git a/src/roe/_generated/models/agent_version_create_request.py b/src/roe/_generated/models/agent_version_create_request.py index dabf8c8..db2474e 100644 --- a/src/roe/_generated/models/agent_version_create_request.py +++ b/src/roe/_generated/models/agent_version_create_request.py @@ -29,7 +29,9 @@ class AgentVersionCreateRequest: Attributes: version_name (str | Unset): Version name for the agent version. Defaults to 'unnamed version' if not provided. description (None | str | Unset): Description for the agent version. - input_definitions (Any | Unset): List of input definitions for this agent version. + input_definitions (Any | Unset): List of input definitions for this agent version. Engines with fixed job inputs + (the policy-aware investigation engines) accept only the keys they declare; any additional key is rejected. Per- + case detail belongs inside the value of an accepted field, which is free text. engine_config (Any | Unset): Engine configuration as a dictionary of string key-value pairs. post_actions (list[PostActionSpecRequest] | Unset): Connector write actions for this version. Omitted: the new version keeps the current version's actions. A list: those become the new version's actions. []: the new version diff --git a/src/roe/_generated/models/agents_list_tags_match.py b/src/roe/_generated/models/agents_list_tags_match.py new file mode 100644 index 0000000..a6afd9e --- /dev/null +++ b/src/roe/_generated/models/agents_list_tags_match.py @@ -0,0 +1,8 @@ +from enum import Enum + +class AgentsListTagsMatch(str, Enum): + ALL = "all" + ANY = "any" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/base_agent_create_request.py b/src/roe/_generated/models/base_agent_create_request.py index bf3bfbb..67b63fd 100644 --- a/src/roe/_generated/models/base_agent_create_request.py +++ b/src/roe/_generated/models/base_agent_create_request.py @@ -31,7 +31,9 @@ class BaseAgentCreateRequest: authenticated API key/token. Accepted for backwards compatibility. version_name (str | Unset): Name of the first version. description (str | Unset): Description of the first version. - input_definitions (Any | Unset): Input definitions for the first version. + input_definitions (Any | Unset): Input definitions for the first version. Engines with fixed job inputs (the + policy-aware investigation engines) accept only the keys they declare; any additional key is rejected. Per-case + detail belongs inside the value of an accepted field, which is free text. engine_config (Any | Unset): Engine configuration for the first version. """ diff --git a/src/roe/_generated/models/connection.py b/src/roe/_generated/models/connection.py index 936f4d7..1e16340 100644 --- a/src/roe/_generated/models/connection.py +++ b/src/roe/_generated/models/connection.py @@ -45,6 +45,7 @@ class Connection: dynamic_inputs (ConnectionDynamicInputs): dynamic_input_test_disabled_reason (None | str): auth_config (ConnectionAuthConfig): + browser_session_expires_at (datetime.datetime | None): created_at (datetime.datetime): updated_at (datetime.datetime): description (str | Unset): @@ -63,6 +64,7 @@ class Connection: dynamic_inputs: ConnectionDynamicInputs dynamic_input_test_disabled_reason: None | str auth_config: ConnectionAuthConfig + browser_session_expires_at: datetime.datetime | None created_at: datetime.datetime updated_at: datetime.datetime description: str | Unset = UNSET @@ -99,6 +101,12 @@ def to_dict(self) -> dict[str, Any]: auth_config = self.auth_config.to_dict() + browser_session_expires_at: None | str + if isinstance(self.browser_session_expires_at, datetime.datetime): + browser_session_expires_at = self.browser_session_expires_at.isoformat() + else: + browser_session_expires_at = self.browser_session_expires_at + created_at = self.created_at.isoformat() updated_at = self.updated_at.isoformat() @@ -126,6 +134,7 @@ def to_dict(self) -> dict[str, Any]: "dynamic_inputs": dynamic_inputs, "dynamic_input_test_disabled_reason": dynamic_input_test_disabled_reason, "auth_config": auth_config, + "browser_session_expires_at": browser_session_expires_at, "created_at": created_at, "updated_at": updated_at, }) @@ -189,6 +198,24 @@ def _parse_dynamic_input_test_disabled_reason(data: object) -> None | str: + def _parse_browser_session_expires_at(data: object) -> datetime.datetime | None: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + browser_session_expires_at_type_0 = isoparse(data) + + + + return browser_session_expires_at_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(datetime.datetime | None, data) + + browser_session_expires_at = _parse_browser_session_expires_at(d.pop("browser_session_expires_at")) + + created_at = isoparse(d.pop("created_at")) @@ -224,6 +251,7 @@ def _parse_dynamic_input_test_disabled_reason(data: object) -> None | str: dynamic_inputs=dynamic_inputs, dynamic_input_test_disabled_reason=dynamic_input_test_disabled_reason, auth_config=auth_config, + browser_session_expires_at=browser_session_expires_at, created_at=created_at, updated_at=updated_at, description=description, diff --git a/src/roe/_generated/models/connection_authentication_check.py b/src/roe/_generated/models/connection_authentication_check.py new file mode 100644 index 0000000..d0b4a46 --- /dev/null +++ b/src/roe/_generated/models/connection_authentication_check.py @@ -0,0 +1,91 @@ +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.connection_authentication_check_status_enum import ConnectionAuthenticationCheckStatusEnum + + + + + + +T = TypeVar("T", bound="ConnectionAuthenticationCheck") + + + +@_attrs_define +class ConnectionAuthenticationCheck: + """ + Attributes: + status (ConnectionAuthenticationCheckStatusEnum): * `passed` - passed + * `failed` - failed + * `not_configured` - not_configured + * `unsupported` - unsupported + message (str): + """ + + status: ConnectionAuthenticationCheckStatusEnum + message: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + status = self.status.value + + message = self.message + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "status": status, + "message": message, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + status = ConnectionAuthenticationCheckStatusEnum(d.pop("status")) + + + + + message = d.pop("message") + + connection_authentication_check = cls( + status=status, + message=message, + ) + + + connection_authentication_check.additional_properties = d + return connection_authentication_check + + @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/connection_authentication_check_status_enum.py b/src/roe/_generated/models/connection_authentication_check_status_enum.py new file mode 100644 index 0000000..3707d0e --- /dev/null +++ b/src/roe/_generated/models/connection_authentication_check_status_enum.py @@ -0,0 +1,10 @@ +from enum import Enum + +class ConnectionAuthenticationCheckStatusEnum(str, Enum): + FAILED = "failed" + NOT_CONFIGURED = "not_configured" + PASSED = "passed" + UNSUPPORTED = "unsupported" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/connection_authentication_checks.py b/src/roe/_generated/models/connection_authentication_checks.py new file mode 100644 index 0000000..88965c0 --- /dev/null +++ b/src/roe/_generated/models/connection_authentication_checks.py @@ -0,0 +1,95 @@ +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.connection_authentication_check import ConnectionAuthenticationCheck + + + + + +T = TypeVar("T", bound="ConnectionAuthenticationChecks") + + + +@_attrs_define +class ConnectionAuthenticationChecks: + """ + Attributes: + api (ConnectionAuthenticationCheck): + dashboard (ConnectionAuthenticationCheck): + """ + + api: ConnectionAuthenticationCheck + dashboard: ConnectionAuthenticationCheck + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.connection_authentication_check import ConnectionAuthenticationCheck + api = self.api.to_dict() + + dashboard = self.dashboard.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "api": api, + "dashboard": dashboard, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.connection_authentication_check import ConnectionAuthenticationCheck + d = dict(src_dict) + api = ConnectionAuthenticationCheck.from_dict(d.pop("api")) + + + + + dashboard = ConnectionAuthenticationCheck.from_dict(d.pop("dashboard")) + + + + + connection_authentication_checks = cls( + api=api, + dashboard=dashboard, + ) + + + connection_authentication_checks.additional_properties = d + return connection_authentication_checks + + @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/connector_browser_session.py b/src/roe/_generated/models/connector_browser_session.py new file mode 100644 index 0000000..43d83fc --- /dev/null +++ b/src/roe/_generated/models/connector_browser_session.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 + +if TYPE_CHECKING: + from ..models.connector_browser_session_required_config import ConnectorBrowserSessionRequiredConfig + + + + + +T = TypeVar("T", bound="ConnectorBrowserSession") + + + +@_attrs_define +class ConnectorBrowserSession: + """ + Attributes: + field (str): Auth field the capture button sits beside. + required_config (ConnectorBrowserSessionRequiredConfig): Config values required before signing in. + """ + + field: str + required_config: ConnectorBrowserSessionRequiredConfig + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.connector_browser_session_required_config import ConnectorBrowserSessionRequiredConfig + field = self.field + + required_config = self.required_config.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "field": field, + "required_config": required_config, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.connector_browser_session_required_config import ConnectorBrowserSessionRequiredConfig + d = dict(src_dict) + field = d.pop("field") + + required_config = ConnectorBrowserSessionRequiredConfig.from_dict(d.pop("required_config")) + + + + + connector_browser_session = cls( + field=field, + required_config=required_config, + ) + + + connector_browser_session.additional_properties = d + return connector_browser_session + + @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/connector_browser_session_required_config.py b/src/roe/_generated/models/connector_browser_session_required_config.py new file mode 100644 index 0000000..a52fb7f --- /dev/null +++ b/src/roe/_generated/models/connector_browser_session_required_config.py @@ -0,0 +1,66 @@ +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="ConnectorBrowserSessionRequiredConfig") + + + +@_attrs_define +class ConnectorBrowserSessionRequiredConfig: + """ Config values required before signing in. + + """ + + 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) + connector_browser_session_required_config = cls( + ) + + + connector_browser_session_required_config.additional_properties = d + return connector_browser_session_required_config + + @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/connector_metadata.py b/src/roe/_generated/models/connector_metadata.py index d317bbf..a43acdc 100644 --- a/src/roe/_generated/models/connector_metadata.py +++ b/src/roe/_generated/models/connector_metadata.py @@ -11,6 +11,7 @@ from typing import cast if TYPE_CHECKING: + from ..models.connector_browser_session import ConnectorBrowserSession from ..models.connector_metadata_dynamic_input_fields import ConnectorMetadataDynamicInputFields @@ -37,6 +38,7 @@ class ConnectorMetadata: delivery_config_schema (Any | None): dynamic_input_fields (ConnectorMetadataDynamicInputFields): dynamic_input_test_fields (list[str]): + browser_session (ConnectorBrowserSession | None): """ id: str @@ -50,6 +52,7 @@ class ConnectorMetadata: delivery_config_schema: Any | None dynamic_input_fields: ConnectorMetadataDynamicInputFields dynamic_input_test_fields: list[str] + browser_session: ConnectorBrowserSession | None additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -57,6 +60,7 @@ class ConnectorMetadata: def to_dict(self) -> dict[str, Any]: + from ..models.connector_browser_session import ConnectorBrowserSession from ..models.connector_metadata_dynamic_input_fields import ConnectorMetadataDynamicInputFields id = self.id @@ -83,6 +87,12 @@ def to_dict(self) -> dict[str, Any]: + browser_session: dict[str, Any] | None + if isinstance(self.browser_session, ConnectorBrowserSession): + browser_session = self.browser_session.to_dict() + else: + browser_session = self.browser_session + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -98,6 +108,7 @@ def to_dict(self) -> dict[str, Any]: "delivery_config_schema": delivery_config_schema, "dynamic_input_fields": dynamic_input_fields, "dynamic_input_test_fields": dynamic_input_test_fields, + "browser_session": browser_session, }) return field_dict @@ -106,6 +117,7 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.connector_browser_session import ConnectorBrowserSession from ..models.connector_metadata_dynamic_input_fields import ConnectorMetadataDynamicInputFields d = dict(src_dict) id = d.pop("id") @@ -140,6 +152,24 @@ def _parse_delivery_config_schema(data: object) -> Any | None: dynamic_input_test_fields = cast(list[str], d.pop("dynamic_input_test_fields")) + def _parse_browser_session(data: object) -> ConnectorBrowserSession | None: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + browser_session_type_0 = ConnectorBrowserSession.from_dict(data) + + + + return browser_session_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(ConnectorBrowserSession | None, data) + + browser_session = _parse_browser_session(d.pop("browser_session")) + + connector_metadata = cls( id=id, display_name=display_name, @@ -152,6 +182,7 @@ def _parse_delivery_config_schema(data: object) -> Any | None: delivery_config_schema=delivery_config_schema, dynamic_input_fields=dynamic_input_fields, dynamic_input_test_fields=dynamic_input_test_fields, + browser_session=browser_session, ) diff --git a/src/roe/_generated/models/create_skill_set.py b/src/roe/_generated/models/create_skill_set.py new file mode 100644 index 0000000..840c078 --- /dev/null +++ b/src/roe/_generated/models/create_skill_set.py @@ -0,0 +1,200 @@ +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="CreateSkillSet") + + + +@_attrs_define +class CreateSkillSet: + """ Create a new skill set. Its version 0 is always the base skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + Attributes: + id (UUID): + name (str): + organization_id (UUID): + current_version_id (None | UUID): + created_at (datetime.datetime): + updated_at (datetime.datetime): + description (str | Unset): + knowledge_base_key_id (None | Unset | UUID): + """ + + id: UUID + name: str + organization_id: UUID + current_version_id: None | UUID + created_at: datetime.datetime + updated_at: datetime.datetime + description: str | Unset = UNSET + knowledge_base_key_id: None | Unset | UUID = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = str(self.id) + + name = self.name + + organization_id = str(self.organization_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 + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + description = self.description + + knowledge_base_key_id: None | str | Unset + if isinstance(self.knowledge_base_key_id, Unset): + knowledge_base_key_id = UNSET + elif isinstance(self.knowledge_base_key_id, UUID): + knowledge_base_key_id = str(self.knowledge_base_key_id) + else: + knowledge_base_key_id = self.knowledge_base_key_id + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "name": name, + "organization_id": organization_id, + "current_version_id": current_version_id, + "created_at": created_at, + "updated_at": updated_at, + }) + if description is not UNSET: + field_dict["description"] = description + if knowledge_base_key_id is not UNSET: + field_dict["knowledge_base_key_id"] = knowledge_base_key_id + + 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")) + + + + + name = d.pop("name") + + organization_id = UUID(d.pop("organization_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")) + + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + description = d.pop("description", UNSET) + + def _parse_knowledge_base_key_id(data: object) -> None | Unset | UUID: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + knowledge_base_key_id_type_0 = UUID(data) + + + + return knowledge_base_key_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | Unset | UUID, data) + + knowledge_base_key_id = _parse_knowledge_base_key_id(d.pop("knowledge_base_key_id", UNSET)) + + + create_skill_set = cls( + id=id, + name=name, + organization_id=organization_id, + current_version_id=current_version_id, + created_at=created_at, + updated_at=updated_at, + description=description, + knowledge_base_key_id=knowledge_base_key_id, + ) + + + create_skill_set.additional_properties = d + return create_skill_set + + @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/create_skill_set_request.py b/src/roe/_generated/models/create_skill_set_request.py new file mode 100644 index 0000000..2b40384 --- /dev/null +++ b/src/roe/_generated/models/create_skill_set_request.py @@ -0,0 +1,126 @@ +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 + + + + + + +T = TypeVar("T", bound="CreateSkillSetRequest") + + + +@_attrs_define +class CreateSkillSetRequest: + """ Create a new skill set. Its version 0 is always the base skill. + + Every set starts from the same built-in base content; customization happens + by creating a new version on top of it (``POST .../versions/``), which is + also what makes the edit downloadable and rollback-able. + + Attributes: + name (str): + description (str | Unset): + knowledge_base_key_id (None | Unset | UUID): + """ + + name: str + description: str | Unset = UNSET + knowledge_base_key_id: None | Unset | UUID = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + name = self.name + + description = self.description + + knowledge_base_key_id: None | str | Unset + if isinstance(self.knowledge_base_key_id, Unset): + knowledge_base_key_id = UNSET + elif isinstance(self.knowledge_base_key_id, UUID): + knowledge_base_key_id = str(self.knowledge_base_key_id) + else: + knowledge_base_key_id = self.knowledge_base_key_id + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "name": name, + }) + if description is not UNSET: + field_dict["description"] = description + if knowledge_base_key_id is not UNSET: + field_dict["knowledge_base_key_id"] = knowledge_base_key_id + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + name = d.pop("name") + + description = d.pop("description", UNSET) + + def _parse_knowledge_base_key_id(data: object) -> None | Unset | UUID: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + knowledge_base_key_id_type_0 = UUID(data) + + + + return knowledge_base_key_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | Unset | UUID, data) + + knowledge_base_key_id = _parse_knowledge_base_key_id(d.pop("knowledge_base_key_id", UNSET)) + + + create_skill_set_request = cls( + name=name, + description=description, + knowledge_base_key_id=knowledge_base_key_id, + ) + + + create_skill_set_request.additional_properties = d + return create_skill_set_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/create_skill_set_version.py b/src/roe/_generated/models/create_skill_set_version.py new file mode 100644 index 0000000..d0fd9df --- /dev/null +++ b/src/roe/_generated/models/create_skill_set_version.py @@ -0,0 +1,156 @@ +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.create_skill_set_version_file_changes_item import CreateSkillSetVersionFileChangesItem + from ..models.skill_file import SkillFile + + + + + +T = TypeVar("T", bound="CreateSkillSetVersion") + + + +@_attrs_define +class CreateSkillSetVersion: + """ Create a new (full) version of an existing skill set. + + Attributes: + id (UUID): + files (list[SkillFile]): The complete file set for this new version. + version_name (str | Unset): Version name (auto-generated if not provided). + summary (str | Unset): What this version changed and why, in plain language. Default: ''. + file_changes (list[CreateSkillSetVersionFileChangesItem] | Unset): Per-file walkthrough: [{path, status, note, + added_lines, removed_lines}]. status is created, edited, or untouched. + """ + + id: UUID + files: list[SkillFile] + version_name: str | Unset = UNSET + summary: str | Unset = '' + file_changes: list[CreateSkillSetVersionFileChangesItem] | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.create_skill_set_version_file_changes_item import CreateSkillSetVersionFileChangesItem + from ..models.skill_file import SkillFile + id = str(self.id) + + files = [] + for files_item_data in self.files: + files_item = files_item_data.to_dict() + files.append(files_item) + + + + version_name = self.version_name + + summary = self.summary + + file_changes: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.file_changes, Unset): + file_changes = [] + for file_changes_item_data in self.file_changes: + file_changes_item = file_changes_item_data.to_dict() + file_changes.append(file_changes_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "files": files, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if summary is not UNSET: + field_dict["summary"] = summary + if file_changes is not UNSET: + field_dict["file_changes"] = file_changes + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.create_skill_set_version_file_changes_item import CreateSkillSetVersionFileChangesItem + from ..models.skill_file import SkillFile + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + files = [] + _files = d.pop("files") + for files_item_data in (_files): + files_item = SkillFile.from_dict(files_item_data) + + + + files.append(files_item) + + + version_name = d.pop("version_name", UNSET) + + summary = d.pop("summary", UNSET) + + _file_changes = d.pop("file_changes", UNSET) + file_changes: list[CreateSkillSetVersionFileChangesItem] | Unset = UNSET + if _file_changes is not UNSET: + file_changes = [] + for file_changes_item_data in _file_changes: + file_changes_item = CreateSkillSetVersionFileChangesItem.from_dict(file_changes_item_data) + + + + file_changes.append(file_changes_item) + + + create_skill_set_version = cls( + id=id, + files=files, + version_name=version_name, + summary=summary, + file_changes=file_changes, + ) + + + create_skill_set_version.additional_properties = d + return create_skill_set_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/create_skill_set_version_file_changes_item.py b/src/roe/_generated/models/create_skill_set_version_file_changes_item.py new file mode 100644 index 0000000..6120233 --- /dev/null +++ b/src/roe/_generated/models/create_skill_set_version_file_changes_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="CreateSkillSetVersionFileChangesItem") + + + +@_attrs_define +class CreateSkillSetVersionFileChangesItem: + """ + """ + + 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) + create_skill_set_version_file_changes_item = cls( + ) + + + create_skill_set_version_file_changes_item.additional_properties = d + return create_skill_set_version_file_changes_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/create_skill_set_version_request.py b/src/roe/_generated/models/create_skill_set_version_request.py new file mode 100644 index 0000000..b4dc7c7 --- /dev/null +++ b/src/roe/_generated/models/create_skill_set_version_request.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 ..types import UNSET, Unset +from typing import cast +from uuid import UUID + +if TYPE_CHECKING: + from ..models.create_skill_set_version_request_file_changes_item import CreateSkillSetVersionRequestFileChangesItem + from ..models.skill_file_request import SkillFileRequest + + + + + +T = TypeVar("T", bound="CreateSkillSetVersionRequest") + + + +@_attrs_define +class CreateSkillSetVersionRequest: + """ Create a new (full) version of an existing skill set. + + Attributes: + files (list[SkillFileRequest]): The complete file set for this new version. + version_name (str | Unset): Version name (auto-generated if not provided). + base_version_id (UUID | Unset): ID of the version this was derived from. + summary (str | Unset): What this version changed and why, in plain language. Default: ''. + file_changes (list[CreateSkillSetVersionRequestFileChangesItem] | Unset): Per-file walkthrough: [{path, status, + note, added_lines, removed_lines}]. status is created, edited, or untouched. + """ + + files: list[SkillFileRequest] + version_name: str | Unset = UNSET + base_version_id: UUID | Unset = UNSET + summary: str | Unset = '' + file_changes: list[CreateSkillSetVersionRequestFileChangesItem] | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.create_skill_set_version_request_file_changes_item import CreateSkillSetVersionRequestFileChangesItem + from ..models.skill_file_request import SkillFileRequest + files = [] + for files_item_data in self.files: + files_item = files_item_data.to_dict() + files.append(files_item) + + + + version_name = self.version_name + + base_version_id: str | Unset = UNSET + if not isinstance(self.base_version_id, Unset): + base_version_id = str(self.base_version_id) + + summary = self.summary + + file_changes: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.file_changes, Unset): + file_changes = [] + for file_changes_item_data in self.file_changes: + file_changes_item = file_changes_item_data.to_dict() + file_changes.append(file_changes_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "files": files, + }) + if version_name is not UNSET: + field_dict["version_name"] = version_name + if base_version_id is not UNSET: + field_dict["base_version_id"] = base_version_id + if summary is not UNSET: + field_dict["summary"] = summary + if file_changes is not UNSET: + field_dict["file_changes"] = file_changes + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.create_skill_set_version_request_file_changes_item import CreateSkillSetVersionRequestFileChangesItem + from ..models.skill_file_request import SkillFileRequest + d = dict(src_dict) + files = [] + _files = d.pop("files") + for files_item_data in (_files): + files_item = SkillFileRequest.from_dict(files_item_data) + + + + files.append(files_item) + + + version_name = d.pop("version_name", UNSET) + + _base_version_id = d.pop("base_version_id", UNSET) + base_version_id: UUID | Unset + if isinstance(_base_version_id, Unset): + base_version_id = UNSET + else: + base_version_id = UUID(_base_version_id) + + + + + summary = d.pop("summary", UNSET) + + _file_changes = d.pop("file_changes", UNSET) + file_changes: list[CreateSkillSetVersionRequestFileChangesItem] | Unset = UNSET + if _file_changes is not UNSET: + file_changes = [] + for file_changes_item_data in _file_changes: + file_changes_item = CreateSkillSetVersionRequestFileChangesItem.from_dict(file_changes_item_data) + + + + file_changes.append(file_changes_item) + + + create_skill_set_version_request = cls( + files=files, + version_name=version_name, + base_version_id=base_version_id, + summary=summary, + file_changes=file_changes, + ) + + + create_skill_set_version_request.additional_properties = d + return create_skill_set_version_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/create_skill_set_version_request_file_changes_item.py b/src/roe/_generated/models/create_skill_set_version_request_file_changes_item.py new file mode 100644 index 0000000..b66b35f --- /dev/null +++ b/src/roe/_generated/models/create_skill_set_version_request_file_changes_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="CreateSkillSetVersionRequestFileChangesItem") + + + +@_attrs_define +class CreateSkillSetVersionRequestFileChangesItem: + """ + """ + + 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) + create_skill_set_version_request_file_changes_item = cls( + ) + + + create_skill_set_version_request_file_changes_item.additional_properties = d + return create_skill_set_version_request_file_changes_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/generate_skill_set_version_request.py b/src/roe/_generated/models/generate_skill_set_version_request.py new file mode 100644 index 0000000..d5de4bd --- /dev/null +++ b/src/roe/_generated/models/generate_skill_set_version_request.py @@ -0,0 +1,186 @@ +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 + + + + + + +T = TypeVar("T", bound="GenerateSkillSetVersionRequest") + + + +@_attrs_define +class GenerateSkillSetVersionRequest: + """ Request to author the next version of a skill set with an agent. + + ``base_version_id`` is the version the draft is derived from; omit it to + start from the set's current version. By default nothing here writes a + version — the generated file set comes back for review and is saved + through the normal version-create path. With ``auto_commit`` the workflow + saves it itself on success, through that same path. At least one table name + or attachment is required; a use case or policy alone is not a data source. + + Attributes: + use_case (str): What the company does and what this agent decides: the decision scope, the labels it may apply, + and anything it must always do. + base_version_id (UUID | Unset): Version to start from. Defaults to the set's current version. + auto_commit (bool | Unset): Save the generated draft as the set's next version automatically when the run + succeeds, skipping draft review. Agents following the set pick the new version up the moment it lands. Default: + False. + table_names (list[str] | Unset): Roe table names the agent may profile to learn the data shape. + attachments (list[str] | Unset): File IDs (file_) of CSVs or documents to read. + policy_id (UUID | Unset): Policy whose dispositions the generated skill must use as its label list. Omit to let + the agent choose labels from the use case. + policy_version_id (UUID | Unset): Requires policy_id. Which version of that policy to read. Defaults to the + policy's current version. An agent may be pinned to an older one. + """ + + use_case: str + base_version_id: UUID | Unset = UNSET + auto_commit: bool | Unset = False + table_names: list[str] | Unset = UNSET + attachments: list[str] | Unset = UNSET + policy_id: UUID | Unset = UNSET + policy_version_id: UUID | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + use_case = self.use_case + + base_version_id: str | Unset = UNSET + if not isinstance(self.base_version_id, Unset): + base_version_id = str(self.base_version_id) + + auto_commit = self.auto_commit + + table_names: list[str] | Unset = UNSET + if not isinstance(self.table_names, Unset): + table_names = self.table_names + + + + attachments: list[str] | Unset = UNSET + if not isinstance(self.attachments, Unset): + attachments = self.attachments + + + + policy_id: str | Unset = UNSET + if not isinstance(self.policy_id, Unset): + policy_id = str(self.policy_id) + + policy_version_id: str | Unset = UNSET + if not isinstance(self.policy_version_id, Unset): + policy_version_id = str(self.policy_version_id) + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "use_case": use_case, + }) + if base_version_id is not UNSET: + field_dict["base_version_id"] = base_version_id + if auto_commit is not UNSET: + field_dict["auto_commit"] = auto_commit + if table_names is not UNSET: + field_dict["table_names"] = table_names + if attachments is not UNSET: + field_dict["attachments"] = attachments + if policy_id is not UNSET: + field_dict["policy_id"] = policy_id + if policy_version_id is not UNSET: + field_dict["policy_version_id"] = policy_version_id + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + use_case = d.pop("use_case") + + _base_version_id = d.pop("base_version_id", UNSET) + base_version_id: UUID | Unset + if isinstance(_base_version_id, Unset): + base_version_id = UNSET + else: + base_version_id = UUID(_base_version_id) + + + + + auto_commit = d.pop("auto_commit", UNSET) + + table_names = cast(list[str], d.pop("table_names", UNSET)) + + + attachments = cast(list[str], d.pop("attachments", UNSET)) + + + _policy_id = d.pop("policy_id", UNSET) + policy_id: UUID | Unset + if isinstance(_policy_id, Unset): + policy_id = UNSET + else: + policy_id = UUID(_policy_id) + + + + + _policy_version_id = d.pop("policy_version_id", UNSET) + policy_version_id: UUID | Unset + if isinstance(_policy_version_id, Unset): + policy_version_id = UNSET + else: + policy_version_id = UUID(_policy_version_id) + + + + + generate_skill_set_version_request = cls( + use_case=use_case, + base_version_id=base_version_id, + auto_commit=auto_commit, + table_names=table_names, + attachments=attachments, + policy_id=policy_id, + policy_version_id=policy_version_id, + ) + + + generate_skill_set_version_request.additional_properties = d + return generate_skill_set_version_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/generate_skill_set_version_response.py b/src/roe/_generated/models/generate_skill_set_version_response.py new file mode 100644 index 0000000..f74a553 --- /dev/null +++ b/src/roe/_generated/models/generate_skill_set_version_response.py @@ -0,0 +1,97 @@ +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 uuid import UUID + + + + + + +T = TypeVar("T", bound="GenerateSkillSetVersionResponse") + + + +@_attrs_define +class GenerateSkillSetVersionResponse: + """ Where to stream the generation run's progress and result. + + Attributes: + workflow_id (str): Temporal workflow ID for tracking the process + sse_endpoint (str): SSE endpoint URL for real-time status updates + run_id (UUID): Identifies this run for reattaching to it or cancelling it. + """ + + workflow_id: str + sse_endpoint: str + run_id: UUID + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + workflow_id = self.workflow_id + + sse_endpoint = self.sse_endpoint + + run_id = str(self.run_id) + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "workflow_id": workflow_id, + "sse_endpoint": sse_endpoint, + "run_id": run_id, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflow_id = d.pop("workflow_id") + + sse_endpoint = d.pop("sse_endpoint") + + run_id = UUID(d.pop("run_id")) + + + + + generate_skill_set_version_response = cls( + workflow_id=workflow_id, + sse_endpoint=sse_endpoint, + run_id=run_id, + ) + + + generate_skill_set_version_response.additional_properties = d + return generate_skill_set_version_response + + @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_skill_set_list.py b/src/roe/_generated/models/paginated_skill_set_list.py new file mode 100644 index 0000000..a0372f6 --- /dev/null +++ b/src/roe/_generated/models/paginated_skill_set_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.skill_set import SkillSet + + + + + +T = TypeVar("T", bound="PaginatedSkillSetList") + + + +@_attrs_define +class PaginatedSkillSetList: + """ + Attributes: + count (int): Example: 123. + results (list[SkillSet]): + 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[SkillSet] + 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.skill_set import SkillSet + 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.skill_set import SkillSet + d = dict(src_dict) + count = d.pop("count") + + results = [] + _results = d.pop("results") + for results_item_data in (_results): + results_item = SkillSet.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_skill_set_list = cls( + count=count, + results=results, + next_=next_, + previous=previous, + ) + + + paginated_skill_set_list.additional_properties = d + return paginated_skill_set_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_skill_set_version_list.py b/src/roe/_generated/models/paginated_skill_set_version_list.py new file mode 100644 index 0000000..7f7d7e2 --- /dev/null +++ b/src/roe/_generated/models/paginated_skill_set_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.skill_set_version import SkillSetVersion + + + + + +T = TypeVar("T", bound="PaginatedSkillSetVersionList") + + + +@_attrs_define +class PaginatedSkillSetVersionList: + """ + Attributes: + count (int): Example: 123. + results (list[SkillSetVersion]): + 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[SkillSetVersion] + 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.skill_set_version import SkillSetVersion + 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.skill_set_version import SkillSetVersion + d = dict(src_dict) + count = d.pop("count") + + results = [] + _results = d.pop("results") + for results_item_data in (_results): + results_item = SkillSetVersion.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_skill_set_version_list = cls( + count=count, + results=results, + next_=next_, + previous=previous, + ) + + + paginated_skill_set_version_list.additional_properties = d + return paginated_skill_set_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/patched_update_skill_set_request.py b/src/roe/_generated/models/patched_update_skill_set_request.py new file mode 100644 index 0000000..bfdc836 --- /dev/null +++ b/src/roe/_generated/models/patched_update_skill_set_request.py @@ -0,0 +1,123 @@ +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 + + + + + + +T = TypeVar("T", bound="PatchedUpdateSkillSetRequest") + + + +@_attrs_define +class PatchedUpdateSkillSetRequest: + """ Update skill set metadata (name, description, key) only. + + Attributes: + name (str | Unset): + description (str | Unset): + knowledge_base_key_id (None | Unset | UUID): + """ + + name: str | Unset = UNSET + description: str | Unset = UNSET + knowledge_base_key_id: None | Unset | UUID = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + name = self.name + + description = self.description + + knowledge_base_key_id: None | str | Unset + if isinstance(self.knowledge_base_key_id, Unset): + knowledge_base_key_id = UNSET + elif isinstance(self.knowledge_base_key_id, UUID): + knowledge_base_key_id = str(self.knowledge_base_key_id) + else: + knowledge_base_key_id = self.knowledge_base_key_id + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + }) + if name is not UNSET: + field_dict["name"] = name + if description is not UNSET: + field_dict["description"] = description + if knowledge_base_key_id is not UNSET: + field_dict["knowledge_base_key_id"] = knowledge_base_key_id + + 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) + + description = d.pop("description", UNSET) + + def _parse_knowledge_base_key_id(data: object) -> None | Unset | UUID: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + knowledge_base_key_id_type_0 = UUID(data) + + + + return knowledge_base_key_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | Unset | UUID, data) + + knowledge_base_key_id = _parse_knowledge_base_key_id(d.pop("knowledge_base_key_id", UNSET)) + + + patched_update_skill_set_request = cls( + name=name, + description=description, + knowledge_base_key_id=knowledge_base_key_id, + ) + + + patched_update_skill_set_request.additional_properties = d + return patched_update_skill_set_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/public_skill_set_generation.py b/src/roe/_generated/models/public_skill_set_generation.py new file mode 100644 index 0000000..a12547d --- /dev/null +++ b/src/roe/_generated/models/public_skill_set_generation.py @@ -0,0 +1,101 @@ +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.skill_set_generation_run import SkillSetGenerationRun + + + + + +T = TypeVar("T", bound="PublicSkillSetGeneration") + + + +@_attrs_define +class PublicSkillSetGeneration: + """ + Attributes: + generation (None | SkillSetGenerationRun): + """ + + generation: None | SkillSetGenerationRun + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.skill_set_generation_run import SkillSetGenerationRun + generation: dict[str, Any] | None + if isinstance(self.generation, SkillSetGenerationRun): + generation = self.generation.to_dict() + else: + generation = self.generation + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "generation": generation, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.skill_set_generation_run import SkillSetGenerationRun + d = dict(src_dict) + def _parse_generation(data: object) -> None | SkillSetGenerationRun: + if data is None: + return data + try: + if not isinstance(data, dict): + raise TypeError() + generation_type_0 = SkillSetGenerationRun.from_dict(data) + + + + return generation_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | SkillSetGenerationRun, data) + + generation = _parse_generation(d.pop("generation")) + + + public_skill_set_generation = cls( + generation=generation, + ) + + + public_skill_set_generation.additional_properties = d + return public_skill_set_generation + + @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/skill_file.py b/src/roe/_generated/models/skill_file.py new file mode 100644 index 0000000..6eae36d --- /dev/null +++ b/src/roe/_generated/models/skill_file.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 + + + + + + + +T = TypeVar("T", bound="SkillFile") + + + +@_attrs_define +class SkillFile: + """ One markdown file (relative_path + content) inside a skill set version. + + Attributes: + relative_path (str): + content (str): + """ + + relative_path: str + content: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + relative_path = self.relative_path + + content = self.content + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "relative_path": relative_path, + "content": content, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + relative_path = d.pop("relative_path") + + content = d.pop("content") + + skill_file = cls( + relative_path=relative_path, + content=content, + ) + + + skill_file.additional_properties = d + return skill_file + + @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/skill_file_request.py b/src/roe/_generated/models/skill_file_request.py new file mode 100644 index 0000000..71d16d1 --- /dev/null +++ b/src/roe/_generated/models/skill_file_request.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 + + + + + + + +T = TypeVar("T", bound="SkillFileRequest") + + + +@_attrs_define +class SkillFileRequest: + """ One markdown file (relative_path + content) inside a skill set version. + + Attributes: + relative_path (str): + content (str): + """ + + relative_path: str + content: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + relative_path = self.relative_path + + content = self.content + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "relative_path": relative_path, + "content": content, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + relative_path = d.pop("relative_path") + + content = d.pop("content") + + skill_file_request = cls( + relative_path=relative_path, + content=content, + ) + + + skill_file_request.additional_properties = d + return skill_file_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/skill_set.py b/src/roe/_generated/models/skill_set.py new file mode 100644 index 0000000..5e495fe --- /dev/null +++ b/src/roe/_generated/models/skill_set.py @@ -0,0 +1,189 @@ +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 dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="SkillSet") + + + +@_attrs_define +class SkillSet: + """ Skill set metadata (read). + + Attributes: + id (UUID): + name (str): + description (str): + organization_id (UUID): + knowledge_base_key_id (None | UUID): + current_version_id (None | UUID): + created_at (datetime.datetime): + updated_at (datetime.datetime): + """ + + id: UUID + name: str + description: str + organization_id: UUID + knowledge_base_key_id: None | UUID + current_version_id: None | UUID + created_at: datetime.datetime + updated_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) + + name = self.name + + description = self.description + + organization_id = str(self.organization_id) + + knowledge_base_key_id: None | str + if isinstance(self.knowledge_base_key_id, UUID): + knowledge_base_key_id = str(self.knowledge_base_key_id) + else: + knowledge_base_key_id = self.knowledge_base_key_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 + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "name": name, + "description": description, + "organization_id": organization_id, + "knowledge_base_key_id": knowledge_base_key_id, + "current_version_id": current_version_id, + "created_at": created_at, + "updated_at": updated_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")) + + + + + name = d.pop("name") + + description = d.pop("description") + + organization_id = UUID(d.pop("organization_id")) + + + + + def _parse_knowledge_base_key_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + knowledge_base_key_id_type_0 = UUID(data) + + + + return knowledge_base_key_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + knowledge_base_key_id = _parse_knowledge_base_key_id(d.pop("knowledge_base_key_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")) + + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + skill_set = cls( + id=id, + name=name, + description=description, + organization_id=organization_id, + knowledge_base_key_id=knowledge_base_key_id, + current_version_id=current_version_id, + created_at=created_at, + updated_at=updated_at, + ) + + + skill_set.additional_properties = d + return skill_set + + @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/skill_set_delete_conflict.py b/src/roe/_generated/models/skill_set_delete_conflict.py new file mode 100644 index 0000000..119db86 --- /dev/null +++ b/src/roe/_generated/models/skill_set_delete_conflict.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.skill_set_dependent_agent_info import SkillSetDependentAgentInfo + + + + + +T = TypeVar("T", bound="SkillSetDeleteConflict") + + + +@_attrs_define +class SkillSetDeleteConflict: + """ 409 body when a skill set cannot be deleted because agents reference it. + + Attributes: + error (str): + dependent_agents (list[SkillSetDependentAgentInfo]): + """ + + error: str + dependent_agents: list[SkillSetDependentAgentInfo] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.skill_set_dependent_agent_info import SkillSetDependentAgentInfo + error = self.error + + dependent_agents = [] + for dependent_agents_item_data in self.dependent_agents: + dependent_agents_item = dependent_agents_item_data.to_dict() + dependent_agents.append(dependent_agents_item) + + + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "error": error, + "dependent_agents": dependent_agents, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.skill_set_dependent_agent_info import SkillSetDependentAgentInfo + d = dict(src_dict) + error = d.pop("error") + + dependent_agents = [] + _dependent_agents = d.pop("dependent_agents") + for dependent_agents_item_data in (_dependent_agents): + dependent_agents_item = SkillSetDependentAgentInfo.from_dict(dependent_agents_item_data) + + + + dependent_agents.append(dependent_agents_item) + + + skill_set_delete_conflict = cls( + error=error, + dependent_agents=dependent_agents, + ) + + + skill_set_delete_conflict.additional_properties = d + return skill_set_delete_conflict + + @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/skill_set_dependent_agent_info.py b/src/roe/_generated/models/skill_set_dependent_agent_info.py new file mode 100644 index 0000000..6da4db6 --- /dev/null +++ b/src/roe/_generated/models/skill_set_dependent_agent_info.py @@ -0,0 +1,108 @@ +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 uuid import UUID + + + + + + +T = TypeVar("T", bound="SkillSetDependentAgentInfo") + + + +@_attrs_define +class SkillSetDependentAgentInfo: + """ An agent version that references a skill set (see get_agents_using_skill_set). + + Attributes: + base_agent_id (UUID): + agent_name (str): + version_id (UUID): + version_name (str): + """ + + base_agent_id: UUID + agent_name: str + version_id: UUID + version_name: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + base_agent_id = str(self.base_agent_id) + + agent_name = self.agent_name + + version_id = str(self.version_id) + + version_name = self.version_name + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "base_agent_id": base_agent_id, + "agent_name": agent_name, + "version_id": version_id, + "version_name": version_name, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + base_agent_id = UUID(d.pop("base_agent_id")) + + + + + agent_name = d.pop("agent_name") + + version_id = UUID(d.pop("version_id")) + + + + + version_name = d.pop("version_name") + + skill_set_dependent_agent_info = cls( + base_agent_id=base_agent_id, + agent_name=agent_name, + version_id=version_id, + version_name=version_name, + ) + + + skill_set_dependent_agent_info.additional_properties = d + return skill_set_dependent_agent_info + + @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/skill_set_generation_run.py b/src/roe/_generated/models/skill_set_generation_run.py new file mode 100644 index 0000000..310e3bc --- /dev/null +++ b/src/roe/_generated/models/skill_set_generation_run.py @@ -0,0 +1,119 @@ +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 dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="SkillSetGenerationRun") + + + +@_attrs_define +class SkillSetGenerationRun: + """ A generation already in flight, so a page can reattach to it. + + Attributes: + workflow_id (str): Temporal workflow ID for tracking the process + sse_endpoint (str): SSE endpoint URL for real-time status updates + id (UUID): + status (str): building, succeeded, or failed. + started_at (datetime.datetime): When the run started — the UI shows elapsed time from this. + """ + + workflow_id: str + sse_endpoint: str + id: UUID + status: str + started_at: datetime.datetime + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + workflow_id = self.workflow_id + + sse_endpoint = self.sse_endpoint + + id = str(self.id) + + status = self.status + + started_at = self.started_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "workflow_id": workflow_id, + "sse_endpoint": sse_endpoint, + "id": id, + "status": status, + "started_at": started_at, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + workflow_id = d.pop("workflow_id") + + sse_endpoint = d.pop("sse_endpoint") + + id = UUID(d.pop("id")) + + + + + status = d.pop("status") + + started_at = isoparse(d.pop("started_at")) + + + + + skill_set_generation_run = cls( + workflow_id=workflow_id, + sse_endpoint=sse_endpoint, + id=id, + status=status, + started_at=started_at, + ) + + + skill_set_generation_run.additional_properties = d + return skill_set_generation_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/skill_set_version.py b/src/roe/_generated/models/skill_set_version.py new file mode 100644 index 0000000..649b727 --- /dev/null +++ b/src/roe/_generated/models/skill_set_version.py @@ -0,0 +1,214 @@ +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.skill_file import SkillFile + from ..models.skill_set import SkillSet + from ..models.skill_set_version_created_by import SkillSetVersionCreatedBy + + + + + +T = TypeVar("T", bound="SkillSetVersion") + + + +@_attrs_define +class SkillSetVersion: + """ Full skill set version (nested set + files) for read responses. + + Attributes: + id (UUID): + version_name (str): + created_at (datetime.datetime): + updated_at (datetime.datetime): + skill_set (SkillSet): Skill set metadata (read). + created_by (SkillSetVersionCreatedBy): Minimal user serializer for audit metadata on skill set versions. + base_version_id (None | UUID): + files (list[SkillFile]): + summary (str | Unset): + file_changes (Any | Unset): + """ + + id: UUID + version_name: str + created_at: datetime.datetime + updated_at: datetime.datetime + skill_set: SkillSet + created_by: SkillSetVersionCreatedBy + base_version_id: None | UUID + files: list[SkillFile] + summary: str | Unset = UNSET + file_changes: Any | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.skill_file import SkillFile + from ..models.skill_set import SkillSet + from ..models.skill_set_version_created_by import SkillSetVersionCreatedBy + id = str(self.id) + + version_name = self.version_name + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + skill_set = self.skill_set.to_dict() + + created_by = self.created_by.to_dict() + + base_version_id: None | str + if isinstance(self.base_version_id, UUID): + base_version_id = str(self.base_version_id) + else: + base_version_id = self.base_version_id + + files = [] + for files_item_data in self.files: + files_item = files_item_data.to_dict() + files.append(files_item) + + + + summary = self.summary + + file_changes = self.file_changes + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "version_name": version_name, + "created_at": created_at, + "updated_at": updated_at, + "skill_set": skill_set, + "created_by": created_by, + "base_version_id": base_version_id, + "files": files, + }) + if summary is not UNSET: + field_dict["summary"] = summary + if file_changes is not UNSET: + field_dict["file_changes"] = file_changes + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.skill_file import SkillFile + from ..models.skill_set import SkillSet + from ..models.skill_set_version_created_by import SkillSetVersionCreatedBy + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + version_name = d.pop("version_name") + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + skill_set = SkillSet.from_dict(d.pop("skill_set")) + + + + + created_by = SkillSetVersionCreatedBy.from_dict(d.pop("created_by")) + + + + + def _parse_base_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + base_version_id_type_0 = UUID(data) + + + + return base_version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + base_version_id = _parse_base_version_id(d.pop("base_version_id")) + + + files = [] + _files = d.pop("files") + for files_item_data in (_files): + files_item = SkillFile.from_dict(files_item_data) + + + + files.append(files_item) + + + summary = d.pop("summary", UNSET) + + file_changes = d.pop("file_changes", UNSET) + + skill_set_version = cls( + id=id, + version_name=version_name, + created_at=created_at, + updated_at=updated_at, + skill_set=skill_set, + created_by=created_by, + base_version_id=base_version_id, + files=files, + summary=summary, + file_changes=file_changes, + ) + + + skill_set_version.additional_properties = d + return skill_set_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/skill_set_version_created_by.py b/src/roe/_generated/models/skill_set_version_created_by.py new file mode 100644 index 0000000..7a22c49 --- /dev/null +++ b/src/roe/_generated/models/skill_set_version_created_by.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 + + + + + + + +T = TypeVar("T", bound="SkillSetVersionCreatedBy") + + + +@_attrs_define +class SkillSetVersionCreatedBy: + """ Minimal user serializer for audit metadata on skill set versions. + + Attributes: + id (int): + email (str): + display_name (str): + """ + + id: int + email: str + display_name: str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = self.id + + email = self.email + + display_name = self.display_name + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "email": email, + "display_name": display_name, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = d.pop("id") + + email = d.pop("email") + + display_name = d.pop("display_name") + + skill_set_version_created_by = cls( + id=id, + email=email, + display_name=display_name, + ) + + + skill_set_version_created_by.additional_properties = d + return skill_set_version_created_by + + @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/skill_sets_create_response_400.py b/src/roe/_generated/models/skill_sets_create_response_400.py new file mode 100644 index 0000000..3da5bc3 --- /dev/null +++ b/src/roe/_generated/models/skill_sets_create_response_400.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="SkillSetsCreateResponse400") + + + +@_attrs_define +class SkillSetsCreateResponse400: + """ + """ + + 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) + skill_sets_create_response_400 = cls( + ) + + + skill_sets_create_response_400.additional_properties = d + return skill_sets_create_response_400 + + @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/skill_sets_generate_version_response_400.py b/src/roe/_generated/models/skill_sets_generate_version_response_400.py new file mode 100644 index 0000000..8bff8f9 --- /dev/null +++ b/src/roe/_generated/models/skill_sets_generate_version_response_400.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="SkillSetsGenerateVersionResponse400") + + + +@_attrs_define +class SkillSetsGenerateVersionResponse400: + """ + """ + + 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) + skill_sets_generate_version_response_400 = cls( + ) + + + skill_sets_generate_version_response_400.additional_properties = d + return skill_sets_generate_version_response_400 + + @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/skill_sets_versions_create_response_400.py b/src/roe/_generated/models/skill_sets_versions_create_response_400.py new file mode 100644 index 0000000..6ab5d13 --- /dev/null +++ b/src/roe/_generated/models/skill_sets_versions_create_response_400.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="SkillSetsVersionsCreateResponse400") + + + +@_attrs_define +class SkillSetsVersionsCreateResponse400: + """ + """ + + 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) + skill_sets_versions_create_response_400 = cls( + ) + + + skill_sets_versions_create_response_400.additional_properties = d + return skill_sets_versions_create_response_400 + + @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/test_connection.py b/src/roe/_generated/models/test_connection.py index 703e01c..8f40990 100644 --- a/src/roe/_generated/models/test_connection.py +++ b/src/roe/_generated/models/test_connection.py @@ -8,10 +8,13 @@ from ..types import UNSET, Unset +from ..types import UNSET, Unset from dateutil.parser import isoparse from typing import cast import datetime +if TYPE_CHECKING: + from ..models.connection_authentication_checks import ConnectionAuthenticationChecks @@ -29,11 +32,13 @@ class TestConnection: success (bool): message (str): tested_at (datetime.datetime): + checks (ConnectionAuthenticationChecks | Unset): """ success: bool message: str tested_at: datetime.datetime + checks: ConnectionAuthenticationChecks | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -41,12 +46,17 @@ class TestConnection: def to_dict(self) -> dict[str, Any]: + from ..models.connection_authentication_checks import ConnectionAuthenticationChecks success = self.success message = self.message tested_at = self.tested_at.isoformat() + checks: dict[str, Any] | Unset = UNSET + if not isinstance(self.checks, Unset): + checks = self.checks.to_dict() + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -55,6 +65,8 @@ def to_dict(self) -> dict[str, Any]: "message": message, "tested_at": tested_at, }) + if checks is not UNSET: + field_dict["checks"] = checks return field_dict @@ -62,6 +74,7 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.connection_authentication_checks import ConnectionAuthenticationChecks d = dict(src_dict) success = d.pop("success") @@ -72,10 +85,21 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + _checks = d.pop("checks", UNSET) + checks: ConnectionAuthenticationChecks | Unset + if isinstance(_checks, Unset): + checks = UNSET + else: + checks = ConnectionAuthenticationChecks.from_dict(_checks) + + + + test_connection = cls( success=success, message=message, tested_at=tested_at, + checks=checks, ) diff --git a/src/roe/_generated/models/update_skill_set.py b/src/roe/_generated/models/update_skill_set.py new file mode 100644 index 0000000..8f1a4d7 --- /dev/null +++ b/src/roe/_generated/models/update_skill_set.py @@ -0,0 +1,196 @@ +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="UpdateSkillSet") + + + +@_attrs_define +class UpdateSkillSet: + """ Update skill set metadata (name, description, key) only. + + Attributes: + id (UUID): + name (str): + organization_id (UUID): + current_version_id (None | UUID): + created_at (datetime.datetime): + updated_at (datetime.datetime): + description (str | Unset): + knowledge_base_key_id (None | Unset | UUID): + """ + + id: UUID + name: str + organization_id: UUID + current_version_id: None | UUID + created_at: datetime.datetime + updated_at: datetime.datetime + description: str | Unset = UNSET + knowledge_base_key_id: None | Unset | UUID = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = str(self.id) + + name = self.name + + organization_id = str(self.organization_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 + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + description = self.description + + knowledge_base_key_id: None | str | Unset + if isinstance(self.knowledge_base_key_id, Unset): + knowledge_base_key_id = UNSET + elif isinstance(self.knowledge_base_key_id, UUID): + knowledge_base_key_id = str(self.knowledge_base_key_id) + else: + knowledge_base_key_id = self.knowledge_base_key_id + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "name": name, + "organization_id": organization_id, + "current_version_id": current_version_id, + "created_at": created_at, + "updated_at": updated_at, + }) + if description is not UNSET: + field_dict["description"] = description + if knowledge_base_key_id is not UNSET: + field_dict["knowledge_base_key_id"] = knowledge_base_key_id + + 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")) + + + + + name = d.pop("name") + + organization_id = UUID(d.pop("organization_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")) + + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + description = d.pop("description", UNSET) + + def _parse_knowledge_base_key_id(data: object) -> None | Unset | UUID: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, str): + raise TypeError() + knowledge_base_key_id_type_0 = UUID(data) + + + + return knowledge_base_key_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | Unset | UUID, data) + + knowledge_base_key_id = _parse_knowledge_base_key_id(d.pop("knowledge_base_key_id", UNSET)) + + + update_skill_set = cls( + id=id, + name=name, + organization_id=organization_id, + current_version_id=current_version_id, + created_at=created_at, + updated_at=updated_at, + description=description, + knowledge_base_key_id=knowledge_base_key_id, + ) + + + update_skill_set.additional_properties = d + return update_skill_set + + @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 d8de5ef..28755ce 100644 --- a/src/roe/api/_generated_registry.py +++ b/src/roe/api/_generated_registry.py @@ -8,6 +8,7 @@ from roe.api.connections import ConnectionsAPI from roe.api.connectors import ConnectorsAPI from roe.api.discovery import DiscoveryAPI +from roe.api.skill_sets import SkillSetsAPI from roe.api.tables import TablesAPI @@ -15,5 +16,6 @@ "connections": ConnectionsAPI, "connectors": ConnectorsAPI, "discovery": DiscoveryAPI, + "skill_sets": SkillSetsAPI, "tables": TablesAPI, } diff --git a/src/roe/api/skill_sets.py b/src/roe/api/skill_sets.py new file mode 100644 index 0000000..9d21605 --- /dev/null +++ b/src/roe/api/skill_sets.py @@ -0,0 +1,277 @@ +"""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.sdk import ( + skill_sets_create, + skill_sets_destroy, + skill_sets_generate_version, + skill_sets_generation_cancel, + skill_sets_generation_retrieve, + skill_sets_list, + skill_sets_partial_update, + skill_sets_retrieve, + skill_sets_set_current_version, + skill_sets_versions_create, + skill_sets_versions_list, + skill_sets_versions_retrieve, +) +from roe._generated.client import AuthenticatedClient +from roe._generated.models.create_skill_set import CreateSkillSet +from roe._generated.models.create_skill_set_version import CreateSkillSetVersion +from roe._generated.models.generate_skill_set_version_response import ( + GenerateSkillSetVersionResponse, +) +from roe._generated.models.paginated_skill_set_list import PaginatedSkillSetList +from roe._generated.models.paginated_skill_set_version_list import ( + PaginatedSkillSetVersionList, +) +from roe._generated.models.public_skill_set_generation import PublicSkillSetGeneration +from roe._generated.models.skill_set import SkillSet +from roe._generated.models.skill_set_version import SkillSetVersion +from roe._generated.models.update_skill_set import UpdateSkillSet +from roe._generated.types import UNSET +from roe.config import RoeConfig +from roe.utils.generated_request import request_json, request_raw + + +class SkillSetsAPI: + """Manage skill sets, immutable versions, and generation.""" + + 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, + ordering: str | None = None, + page: int | None = None, + page_size: int | None = None, + search: str | None = None, + ) -> PaginatedSkillSetList: + """List skill sets.""" + response = request_raw( + self._raw, + skill_sets_list, + ordering=ordering if ordering is not None else UNSET, + 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 PaginatedSkillSetList.from_dict(response.json()) + + def create( + self, + name: str, + description: str | None = None, + ) -> CreateSkillSet: + """Create a skill set with its initial base version.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["name"] = name + if description is not None: + body["description"] = description + resp = request_json( + self._raw, + skill_sets_create, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def retrieve( + self, + id: str, + ) -> SkillSet: + """Retrieve skill-set metadata.""" + response = request_raw( + self._raw, + skill_sets_retrieve, + id, + organization_id=self._org_id, + ) + return SkillSet.from_dict(response.json()) + + def update( + self, + id: str, + name: str | None = None, + description: str | None = None, + ) -> UpdateSkillSet: + """Update skill-set metadata.""" + body: dict[str, Any] = {} + if name is not None: + body["name"] = name + if description is not None: + body["description"] = description + resp = request_json( + self._raw, + skill_sets_partial_update, + id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def delete( + self, + id: str, + ) -> None: + """Delete a skill set and its versions unless referenced by agents.""" + request_raw( + self._raw, + skill_sets_destroy, + id, + organization_id=self._org_id, + ) + return None + + def generate_version( + self, + skill_set_id: str, + use_case: str, + base_version_id: str | None = None, + auto_commit: bool | None = None, + table_names: list[str] | None = None, + attachments: list[str] | None = None, + policy_id: str | None = None, + policy_version_id: str | None = None, + ) -> GenerateSkillSetVersionResponse: + """Start asynchronous generation. Pass empty slices for unused tables and attachments.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["use_case"] = use_case + if base_version_id is not None: + body["base_version_id"] = base_version_id + if auto_commit is not None: + body["auto_commit"] = auto_commit + if table_names is not None: + body["table_names"] = table_names + if attachments is not None: + body["attachments"] = attachments + if policy_id is not None: + body["policy_id"] = policy_id + if policy_version_id is not None: + body["policy_version_id"] = policy_version_id + resp = request_json( + self._raw, + skill_sets_generate_version, + skill_set_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def get_generation( + self, + skill_set_id: str, + ) -> PublicSkillSetGeneration: + """Read the tracked generation, or null when none exists.""" + response = request_raw( + self._raw, + skill_sets_generation_retrieve, + skill_set_id, + organization_id=self._org_id, + ) + return PublicSkillSetGeneration.from_dict(response.json()) + + def cancel_generation( + self, + skill_set_id: str, + run_id: str, + ) -> None: + """Cancel and stop tracking a generation.""" + request_raw( + self._raw, + skill_sets_generation_cancel, + skill_set_id, + run_id, + organization_id=self._org_id, + ) + return None + + def set_current_version( + self, + skill_set_id: str, + version_id: str, + ) -> SkillSet: + """Select the current version of a skill set.""" + response = request_raw( + self._raw, + skill_sets_set_current_version, + skill_set_id, + version_id, + organization_id=self._org_id, + ) + return SkillSet.from_dict(response.json()) + + def list_versions( + self, + skill_set_id: str, + page: int | None = None, + page_size: int | None = None, + ) -> PaginatedSkillSetVersionList: + """List versions of a skill set.""" + response = request_raw( + self._raw, + skill_sets_versions_list, + skill_set_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 PaginatedSkillSetVersionList.from_dict(response.json()) + + def create_version( + self, + skill_set_id: str, + files: list[dict[str, Any]], + version_name: str | None = None, + base_version_id: str | None = None, + summary: str | None = None, + file_changes: list[dict[str, Any]] | None = None, + ) -> CreateSkillSetVersion: + """Create a complete version and make it current.""" + body: dict[str, Any] = {} + body["organization_id"] = str(self._org_id) + body["files"] = files + if version_name is not None: + body["version_name"] = version_name + if base_version_id is not None: + body["base_version_id"] = base_version_id + if summary is not None: + body["summary"] = summary + if file_changes is not None: + body["file_changes"] = file_changes + resp = request_json( + self._raw, + skill_sets_versions_create, + skill_set_id, + body=body, + organization_id=self._org_id, + ) + return resp.parsed # type: ignore[return-value] + + def retrieve_version( + self, + id: str, + ) -> SkillSetVersion: + """Read a version and its complete file collection.""" + response = request_raw( + self._raw, + skill_sets_versions_retrieve, + id, + organization_id=self._org_id, + ) + return SkillSetVersion.from_dict(response.json()) diff --git a/uv.lock b/uv.lock index 1e0a40b..ed1387e 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.10" [[package]] @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "roe-ai" -version = "1.1.14" +version = "1.1.15" source = { editable = "." } dependencies = [ { name = "attrs" },