From ccdffbc7c8e9f32219a61c165566e3c866f66bde Mon Sep 17 00:00:00 2001 From: Robert Gambee Date: Tue, 24 Feb 2026 18:10:08 -0500 Subject: [PATCH 1/2] Regenerate code from OpenAPI spec --- .../classify_operations_classify_post.py | 195 +++++++++++++++++ .../forecast_operations_forecast_post.py | 91 +++----- .../generated/api/sessions/__init__.py | 2 - .../list_sessions_endpoint_sessions_get.py | 30 +-- .../cancel_task_tasks_task_id_cancel_post.py | 87 ++++++-- src/everyrow/generated/models/__init__.py | 8 + .../generated/models/agent_map_operation.py | 20 ++ .../generated/models/cancel_task_response.py | 72 +++++++ .../generated/models/classify_operation.py | 198 ++++++++++++++++++ .../classify_operation_input_type_1_item.py | 46 ++++ .../models/classify_operation_input_type_2.py | 46 ++++ .../generated/models/dedupe_operation.py | 20 ++ .../generated/models/forecast_operation.py | 85 ++++---- .../forecast_operation_input_type_1_item.py | 25 +-- .../models/forecast_operation_input_type_2.py | 25 +-- .../generated/models/llm_enum_public.py | 3 + .../generated/models/merge_operation.py | 20 ++ .../generated/models/public_task_type.py | 1 + .../generated/models/rank_operation.py | 20 ++ .../generated/models/screen_operation.py | 20 ++ .../generated/models/session_list_item.py | 15 +- .../generated/models/session_list_response.py | 19 +- .../models/single_agent_operation.py | 20 ++ 23 files changed, 871 insertions(+), 197 deletions(-) create mode 100644 src/everyrow/generated/api/operations/classify_operations_classify_post.py create mode 100644 src/everyrow/generated/models/cancel_task_response.py create mode 100644 src/everyrow/generated/models/classify_operation.py create mode 100644 src/everyrow/generated/models/classify_operation_input_type_1_item.py create mode 100644 src/everyrow/generated/models/classify_operation_input_type_2.py diff --git a/src/everyrow/generated/api/operations/classify_operations_classify_post.py b/src/everyrow/generated/api/operations/classify_operations_classify_post.py new file mode 100644 index 00000000..b8d39c38 --- /dev/null +++ b/src/everyrow/generated/api/operations/classify_operations_classify_post.py @@ -0,0 +1,195 @@ +from http import HTTPStatus +from typing import Any + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.classify_operation import ClassifyOperation +from ...models.error_response import ErrorResponse +from ...models.insufficient_balance_error import InsufficientBalanceError +from ...models.operation_response import OperationResponse +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + *, + body: ClassifyOperation, + x_cohort_source: None | str | Unset = UNSET, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + if not isinstance(x_cohort_source, Unset): + headers["X-Cohort-Source"] = x_cohort_source + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/operations/classify", + } + + _kwargs["json"] = body.to_dict() + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: + if response.status_code == 200: + response_200 = OperationResponse.from_dict(response.json()) + + return response_200 + + if response.status_code == 402: + response_402 = InsufficientBalanceError.from_dict(response.json()) + + return response_402 + + if response.status_code == 422: + response_422 = ErrorResponse.from_dict(response.json()) + + return response_422 + + 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[ErrorResponse | InsufficientBalanceError | OperationResponse]: + 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: ClassifyOperation, + x_cohort_source: None | str | Unset = UNSET, +) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: + """Classify rows into categories + + Use AI to classify each row into one of the provided categories. + + Args: + x_cohort_source (None | str | Unset): + body (ClassifyOperation): + + 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[ErrorResponse | InsufficientBalanceError | OperationResponse] + """ + + kwargs = _get_kwargs( + body=body, + x_cohort_source=x_cohort_source, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + *, + client: AuthenticatedClient, + body: ClassifyOperation, + x_cohort_source: None | str | Unset = UNSET, +) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: + """Classify rows into categories + + Use AI to classify each row into one of the provided categories. + + Args: + x_cohort_source (None | str | Unset): + body (ClassifyOperation): + + 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: + ErrorResponse | InsufficientBalanceError | OperationResponse + """ + + return sync_detailed( + client=client, + body=body, + x_cohort_source=x_cohort_source, + ).parsed + + +async def asyncio_detailed( + *, + client: AuthenticatedClient, + body: ClassifyOperation, + x_cohort_source: None | str | Unset = UNSET, +) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: + """Classify rows into categories + + Use AI to classify each row into one of the provided categories. + + Args: + x_cohort_source (None | str | Unset): + body (ClassifyOperation): + + 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[ErrorResponse | InsufficientBalanceError | OperationResponse] + """ + + kwargs = _get_kwargs( + body=body, + x_cohort_source=x_cohort_source, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + *, + client: AuthenticatedClient, + body: ClassifyOperation, + x_cohort_source: None | str | Unset = UNSET, +) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: + """Classify rows into categories + + Use AI to classify each row into one of the provided categories. + + Args: + x_cohort_source (None | str | Unset): + body (ClassifyOperation): + + 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: + ErrorResponse | InsufficientBalanceError | OperationResponse + """ + + return ( + await asyncio_detailed( + client=client, + body=body, + x_cohort_source=x_cohort_source, + ) + ).parsed diff --git a/src/everyrow/generated/api/operations/forecast_operations_forecast_post.py b/src/everyrow/generated/api/operations/forecast_operations_forecast_post.py index e68c8e4c..c12ca09a 100644 --- a/src/everyrow/generated/api/operations/forecast_operations_forecast_post.py +++ b/src/everyrow/generated/api/operations/forecast_operations_forecast_post.py @@ -1,38 +1,26 @@ from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote +from typing import Any import httpx -from ...client import AuthenticatedClient, Client -from ...types import Response, UNSET from ... import errors - +from ...client import AuthenticatedClient, Client from ...models.error_response import ErrorResponse from ...models.forecast_operation import ForecastOperation from ...models.insufficient_balance_error import InsufficientBalanceError from ...models.operation_response import OperationResponse -from ...types import UNSET, Unset -from typing import cast - +from ...types import UNSET, Response, Unset def _get_kwargs( *, body: ForecastOperation, x_cohort_source: None | str | Unset = UNSET, - ) -> dict[str, Any]: headers: dict[str, Any] = {} if not isinstance(x_cohort_source, Unset): headers["X-Cohort-Source"] = x_cohort_source - - - - - - _kwargs: dict[str, Any] = { "method": "post", "url": "/operations/forecast", @@ -40,34 +28,28 @@ def _get_kwargs( _kwargs["json"] = body.to_dict() - headers["Content-Type"] = "application/json" _kwargs["headers"] = headers return _kwargs - -def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: if response.status_code == 200: response_200 = OperationResponse.from_dict(response.json()) - - return response_200 if response.status_code == 402: response_402 = InsufficientBalanceError.from_dict(response.json()) - - return response_402 if response.status_code == 422: response_422 = ErrorResponse.from_dict(response.json()) - - return response_422 if client.raise_on_unexpected_status: @@ -76,7 +58,9 @@ def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Res return None -def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: +def _build_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -90,9 +74,8 @@ def sync_detailed( client: AuthenticatedClient, body: ForecastOperation, x_cohort_source: None | str | Unset = UNSET, - ) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: - """ AI-powered probability forecast + """AI-powered probability forecast Run 6 parallel research agents per row, then synthesize into a probability forecast with rationale. @@ -106,13 +89,11 @@ def sync_detailed( Returns: Response[ErrorResponse | InsufficientBalanceError | OperationResponse] - """ - + """ kwargs = _get_kwargs( body=body, -x_cohort_source=x_cohort_source, - + x_cohort_source=x_cohort_source, ) response = client.get_httpx_client().request( @@ -121,14 +102,14 @@ def sync_detailed( return _build_response(client=client, response=response) + def sync( *, client: AuthenticatedClient, body: ForecastOperation, x_cohort_source: None | str | Unset = UNSET, - ) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: - """ AI-powered probability forecast + """AI-powered probability forecast Run 6 parallel research agents per row, then synthesize into a probability forecast with rationale. @@ -142,24 +123,22 @@ def sync( Returns: ErrorResponse | InsufficientBalanceError | OperationResponse - """ - + """ return sync_detailed( client=client, -body=body, -x_cohort_source=x_cohort_source, - + body=body, + x_cohort_source=x_cohort_source, ).parsed + async def asyncio_detailed( *, client: AuthenticatedClient, body: ForecastOperation, x_cohort_source: None | str | Unset = UNSET, - ) -> Response[ErrorResponse | InsufficientBalanceError | OperationResponse]: - """ AI-powered probability forecast + """AI-powered probability forecast Run 6 parallel research agents per row, then synthesize into a probability forecast with rationale. @@ -173,29 +152,25 @@ async def asyncio_detailed( Returns: Response[ErrorResponse | InsufficientBalanceError | OperationResponse] - """ - + """ kwargs = _get_kwargs( body=body, -x_cohort_source=x_cohort_source, - + x_cohort_source=x_cohort_source, ) - response = await client.get_async_httpx_client().request( - **kwargs - ) + response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + async def asyncio( *, client: AuthenticatedClient, body: ForecastOperation, x_cohort_source: None | str | Unset = UNSET, - ) -> ErrorResponse | InsufficientBalanceError | OperationResponse | None: - """ AI-powered probability forecast + """AI-powered probability forecast Run 6 parallel research agents per row, then synthesize into a probability forecast with rationale. @@ -209,12 +184,12 @@ async def asyncio( Returns: ErrorResponse | InsufficientBalanceError | OperationResponse - """ - - - return (await asyncio_detailed( - client=client, -body=body, -x_cohort_source=x_cohort_source, - - )).parsed + """ + + return ( + await asyncio_detailed( + client=client, + body=body, + x_cohort_source=x_cohort_source, + ) + ).parsed diff --git a/src/everyrow/generated/api/sessions/__init__.py b/src/everyrow/generated/api/sessions/__init__.py index 6ca121ae..2d7c0b23 100644 --- a/src/everyrow/generated/api/sessions/__init__.py +++ b/src/everyrow/generated/api/sessions/__init__.py @@ -1,3 +1 @@ """Contains endpoint functions for accessing the API""" - -from . import list_sessions_endpoint_sessions_get diff --git a/src/everyrow/generated/api/sessions/list_sessions_endpoint_sessions_get.py b/src/everyrow/generated/api/sessions/list_sessions_endpoint_sessions_get.py index df8ad8f9..718676c4 100644 --- a/src/everyrow/generated/api/sessions/list_sessions_endpoint_sessions_get.py +++ b/src/everyrow/generated/api/sessions/list_sessions_endpoint_sessions_get.py @@ -5,7 +5,6 @@ from ... import errors from ...client import AuthenticatedClient, Client -from ...models.http_validation_error import HTTPValidationError from ...models.session_list_response import SessionListResponse from ...types import Response @@ -19,28 +18,19 @@ def _get_kwargs() -> dict[str, Any]: return _kwargs -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> HTTPValidationError | SessionListResponse | None: +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> SessionListResponse | None: if response.status_code == 200: response_200 = SessionListResponse.from_dict(response.json()) return response_200 - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - 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[HTTPValidationError | SessionListResponse]: +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[SessionListResponse]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -52,7 +42,7 @@ def _build_response( def sync_detailed( *, client: AuthenticatedClient, -) -> Response[HTTPValidationError | SessionListResponse]: +) -> Response[SessionListResponse]: """List sessions List all sessions owned by the authenticated user. @@ -62,7 +52,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[HTTPValidationError | SessionListResponse] + Response[SessionListResponse] """ kwargs = _get_kwargs() @@ -77,7 +67,7 @@ def sync_detailed( def sync( *, client: AuthenticatedClient, -) -> HTTPValidationError | SessionListResponse | None: +) -> SessionListResponse | None: """List sessions List all sessions owned by the authenticated user. @@ -87,7 +77,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - HTTPValidationError | SessionListResponse + SessionListResponse """ return sync_detailed( @@ -98,7 +88,7 @@ def sync( async def asyncio_detailed( *, client: AuthenticatedClient, -) -> Response[HTTPValidationError | SessionListResponse]: +) -> Response[SessionListResponse]: """List sessions List all sessions owned by the authenticated user. @@ -108,7 +98,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[HTTPValidationError | SessionListResponse] + Response[SessionListResponse] """ kwargs = _get_kwargs() @@ -121,7 +111,7 @@ async def asyncio_detailed( async def asyncio( *, client: AuthenticatedClient, -) -> HTTPValidationError | SessionListResponse | None: +) -> SessionListResponse | None: """List sessions List all sessions owned by the authenticated user. @@ -131,7 +121,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - HTTPValidationError | SessionListResponse + SessionListResponse """ return ( diff --git a/src/everyrow/generated/api/tasks/cancel_task_tasks_task_id_cancel_post.py b/src/everyrow/generated/api/tasks/cancel_task_tasks_task_id_cancel_post.py index 004cb866..afbab607 100644 --- a/src/everyrow/generated/api/tasks/cancel_task_tasks_task_id_cancel_post.py +++ b/src/everyrow/generated/api/tasks/cancel_task_tasks_task_id_cancel_post.py @@ -7,6 +7,7 @@ from ... import errors from ...client import AuthenticatedClient, Client +from ...models.cancel_task_response import CancelTaskResponse from ...models.error_response import ErrorResponse from ...models.http_validation_error import HTTPValidationError from ...types import Response @@ -27,21 +28,17 @@ def _get_kwargs( def _parse_response( *, client: AuthenticatedClient | Client, response: httpx.Response -) -> ErrorResponse | HTTPValidationError | None: +) -> CancelTaskResponse | ErrorResponse | HTTPValidationError | None: if response.status_code == 200: - # Cancel response is a minimal payload — success is signalled by the 200 status alone. - return None + response_200 = CancelTaskResponse.from_dict(response.json()) + + return response_200 if response.status_code == 404: response_404 = ErrorResponse.from_dict(response.json()) return response_404 - if response.status_code == 409: - response_409 = ErrorResponse.from_dict(response.json()) - - return response_409 - if response.status_code == 422: response_422 = HTTPValidationError.from_dict(response.json()) @@ -55,7 +52,7 @@ def _parse_response( def _build_response( *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[ErrorResponse | HTTPValidationError | None]: +) -> Response[CancelTaskResponse | ErrorResponse | HTTPValidationError]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -68,11 +65,10 @@ def sync_detailed( task_id: UUID, *, client: AuthenticatedClient, -) -> Response[ErrorResponse | HTTPValidationError | None]: - """Cancel a running task +) -> Response[CancelTaskResponse | ErrorResponse | HTTPValidationError]: + """Cancel a task - Cancel a task by its ID. Returns HTTP 200 on success, 404 if not found, - or 409 if the task is already in a terminal state. + Cancel a running or pending task. Returns 409 if the task has already completed. Args: task_id (UUID): @@ -82,7 +78,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ErrorResponse | HTTPValidationError | None] + Response[CancelTaskResponse | ErrorResponse | HTTPValidationError] """ kwargs = _get_kwargs( @@ -96,15 +92,40 @@ def sync_detailed( return _build_response(client=client, response=response) +def sync( + task_id: UUID, + *, + client: AuthenticatedClient, +) -> CancelTaskResponse | ErrorResponse | HTTPValidationError | None: + """Cancel a task + + Cancel a running or pending task. Returns 409 if the task has already completed. + + Args: + task_id (UUID): + + 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: + CancelTaskResponse | ErrorResponse | HTTPValidationError + """ + + return sync_detailed( + task_id=task_id, + client=client, + ).parsed + + async def asyncio_detailed( task_id: UUID, *, client: AuthenticatedClient, -) -> Response[ErrorResponse | HTTPValidationError | None]: - """Cancel a running task +) -> Response[CancelTaskResponse | ErrorResponse | HTTPValidationError]: + """Cancel a task - Cancel a task by its ID. Returns HTTP 200 on success, 404 if not found, - or 409 if the task is already in a terminal state. + Cancel a running or pending task. Returns 409 if the task has already completed. Args: task_id (UUID): @@ -114,7 +135,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[ErrorResponse | HTTPValidationError | None] + Response[CancelTaskResponse | ErrorResponse | HTTPValidationError] """ kwargs = _get_kwargs( @@ -124,3 +145,31 @@ async def asyncio_detailed( response = await client.get_async_httpx_client().request(**kwargs) return _build_response(client=client, response=response) + + +async def asyncio( + task_id: UUID, + *, + client: AuthenticatedClient, +) -> CancelTaskResponse | ErrorResponse | HTTPValidationError | None: + """Cancel a task + + Cancel a running or pending task. Returns 409 if the task has already completed. + + Args: + task_id (UUID): + + 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: + CancelTaskResponse | ErrorResponse | HTTPValidationError + """ + + return ( + await asyncio_detailed( + task_id=task_id, + client=client, + ) + ).parsed diff --git a/src/everyrow/generated/models/__init__.py b/src/everyrow/generated/models/__init__.py index c7be89e3..bd8ee868 100644 --- a/src/everyrow/generated/models/__init__.py +++ b/src/everyrow/generated/models/__init__.py @@ -5,6 +5,10 @@ from .agent_map_operation_input_type_2 import AgentMapOperationInputType2 from .agent_map_operation_response_schema_type_0 import AgentMapOperationResponseSchemaType0 from .billing_response import BillingResponse +from .cancel_task_response import CancelTaskResponse +from .classify_operation import ClassifyOperation +from .classify_operation_input_type_1_item import ClassifyOperationInputType1Item +from .classify_operation_input_type_2 import ClassifyOperationInputType2 from .create_artifact_request import CreateArtifactRequest from .create_artifact_request_data_type_0_item import CreateArtifactRequestDataType0Item from .create_artifact_request_data_type_1 import CreateArtifactRequestDataType1 @@ -64,6 +68,10 @@ "AgentMapOperationInputType2", "AgentMapOperationResponseSchemaType0", "BillingResponse", + "CancelTaskResponse", + "ClassifyOperation", + "ClassifyOperationInputType1Item", + "ClassifyOperationInputType2", "CreateArtifactRequest", "CreateArtifactRequestDataType0Item", "CreateArtifactRequestDataType1", diff --git a/src/everyrow/generated/models/agent_map_operation.py b/src/everyrow/generated/models/agent_map_operation.py index cdc47a5b..ea73c86a 100644 --- a/src/everyrow/generated/models/agent_map_operation.py +++ b/src/everyrow/generated/models/agent_map_operation.py @@ -29,6 +29,7 @@ class AgentMapOperation: of a list of JSON objects task (str): Instructions for the AI agent to execute per row session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. response_schema (AgentMapOperationResponseSchemaType0 | None | Unset): JSON Schema for the response format. If not provided, use default answer schema. llm (LLMEnumPublic | None | Unset): LLM to use for each agent. Required when effort_level is not set. @@ -53,6 +54,7 @@ class AgentMapOperation: input_: AgentMapOperationInputType2 | list[AgentMapOperationInputType1Item] | UUID task: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET response_schema: AgentMapOperationResponseSchemaType0 | None | Unset = UNSET llm: LLMEnumPublic | None | Unset = UNSET effort_level: None | PublicEffortLevel | Unset = UNSET @@ -88,6 +90,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + response_schema: dict[str, Any] | None | Unset if isinstance(self.response_schema, Unset): response_schema = UNSET @@ -144,6 +152,8 @@ def to_dict(self) -> dict[str, Any]: ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url if response_schema is not UNSET: field_dict["response_schema"] = response_schema if llm is not UNSET: @@ -220,6 +230,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + def _parse_response_schema(data: object) -> AgentMapOperationResponseSchemaType0 | None | Unset: if data is None: return data @@ -306,6 +325,7 @@ def _parse_include_research(data: object) -> bool | None | Unset: input_=input_, task=task, session_id=session_id, + webhook_url=webhook_url, response_schema=response_schema, llm=llm, effort_level=effort_level, diff --git a/src/everyrow/generated/models/cancel_task_response.py b/src/everyrow/generated/models/cancel_task_response.py new file mode 100644 index 00000000..9119f343 --- /dev/null +++ b/src/everyrow/generated/models/cancel_task_response.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar +from uuid import UUID + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..models.task_status import TaskStatus + +T = TypeVar("T", bound="CancelTaskResponse") + + +@_attrs_define +class CancelTaskResponse: + """ + Attributes: + task_id (UUID): The cancelled task ID + status (TaskStatus): + """ + + task_id: UUID + status: TaskStatus + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + task_id = str(self.task_id) + + status = self.status.value + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "task_id": task_id, + "status": status, + } + ) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + task_id = UUID(d.pop("task_id")) + + status = TaskStatus(d.pop("status")) + + cancel_task_response = cls( + task_id=task_id, + status=status, + ) + + cancel_task_response.additional_properties = d + return cancel_task_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/everyrow/generated/models/classify_operation.py b/src/everyrow/generated/models/classify_operation.py new file mode 100644 index 00000000..8d43cd90 --- /dev/null +++ b/src/everyrow/generated/models/classify_operation.py @@ -0,0 +1,198 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast +from uuid import UUID + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.classify_operation_input_type_1_item import ClassifyOperationInputType1Item + from ..models.classify_operation_input_type_2 import ClassifyOperationInputType2 + + +T = TypeVar("T", bound="ClassifyOperation") + + +@_attrs_define +class ClassifyOperation: + """ + Attributes: + input_ (ClassifyOperationInputType2 | list[ClassifyOperationInputType1Item] | UUID): The input data as a) the ID + of an existing artifact, b) a single record in the form of a JSON object, or c) a table of records in the form + of a list of JSON objects + task (str): Instructions for classifying each row into a category + categories (list[str]): List of allowed classification categories (minimum 2) + session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. + classification_field (str | Unset): Name of the output column for classification results Default: + 'classification'. + include_reasoning (bool | Unset): Include reasoning in the output as its own column Default: False. + """ + + input_: ClassifyOperationInputType2 | list[ClassifyOperationInputType1Item] | UUID + task: str + categories: list[str] + session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET + classification_field: str | Unset = "classification" + include_reasoning: bool | Unset = False + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + input_: dict[str, Any] | list[dict[str, Any]] | str + if isinstance(self.input_, UUID): + input_ = str(self.input_) + elif isinstance(self.input_, list): + input_ = [] + for input_type_1_item_data in self.input_: + input_type_1_item = input_type_1_item_data.to_dict() + input_.append(input_type_1_item) + + else: + input_ = self.input_.to_dict() + + task = self.task + + categories = self.categories + + session_id: None | str | Unset + if isinstance(self.session_id, Unset): + session_id = UNSET + elif isinstance(self.session_id, UUID): + session_id = str(self.session_id) + else: + session_id = self.session_id + + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + + classification_field = self.classification_field + + include_reasoning = self.include_reasoning + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "input": input_, + "task": task, + "categories": categories, + } + ) + if session_id is not UNSET: + field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url + if classification_field is not UNSET: + field_dict["classification_field"] = classification_field + if include_reasoning is not UNSET: + field_dict["include_reasoning"] = include_reasoning + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.classify_operation_input_type_1_item import ClassifyOperationInputType1Item + from ..models.classify_operation_input_type_2 import ClassifyOperationInputType2 + + d = dict(src_dict) + + def _parse_input_(data: object) -> ClassifyOperationInputType2 | list[ClassifyOperationInputType1Item] | UUID: + try: + if not isinstance(data, str): + raise TypeError() + input_type_0 = UUID(data) + + return input_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + try: + if not isinstance(data, list): + raise TypeError() + input_type_1 = [] + _input_type_1 = data + for input_type_1_item_data in _input_type_1: + input_type_1_item = ClassifyOperationInputType1Item.from_dict(input_type_1_item_data) + + input_type_1.append(input_type_1_item) + + return input_type_1 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + input_type_2 = ClassifyOperationInputType2.from_dict(data) + + return input_type_2 + + input_ = _parse_input_(d.pop("input")) + + task = d.pop("task") + + categories = cast(list[str], d.pop("categories")) + + def _parse_session_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() + session_id_type_0 = UUID(data) + + return session_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | Unset | UUID, data) + + session_id = _parse_session_id(d.pop("session_id", UNSET)) + + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + + classification_field = d.pop("classification_field", UNSET) + + include_reasoning = d.pop("include_reasoning", UNSET) + + classify_operation = cls( + input_=input_, + task=task, + categories=categories, + session_id=session_id, + webhook_url=webhook_url, + classification_field=classification_field, + include_reasoning=include_reasoning, + ) + + classify_operation.additional_properties = d + return classify_operation + + @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/everyrow/generated/models/classify_operation_input_type_1_item.py b/src/everyrow/generated/models/classify_operation_input_type_1_item.py new file mode 100644 index 00000000..38ccbc05 --- /dev/null +++ b/src/everyrow/generated/models/classify_operation_input_type_1_item.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="ClassifyOperationInputType1Item") + + +@_attrs_define +class ClassifyOperationInputType1Item: + """ """ + + 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) + classify_operation_input_type_1_item = cls() + + classify_operation_input_type_1_item.additional_properties = d + return classify_operation_input_type_1_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/everyrow/generated/models/classify_operation_input_type_2.py b/src/everyrow/generated/models/classify_operation_input_type_2.py new file mode 100644 index 00000000..81dcb6bd --- /dev/null +++ b/src/everyrow/generated/models/classify_operation_input_type_2.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="ClassifyOperationInputType2") + + +@_attrs_define +class ClassifyOperationInputType2: + """ """ + + 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) + classify_operation_input_type_2 = cls() + + classify_operation_input_type_2.additional_properties = d + return classify_operation_input_type_2 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/everyrow/generated/models/dedupe_operation.py b/src/everyrow/generated/models/dedupe_operation.py index 09672e38..b06b01e9 100644 --- a/src/everyrow/generated/models/dedupe_operation.py +++ b/src/everyrow/generated/models/dedupe_operation.py @@ -27,6 +27,7 @@ class DedupeOperation: list of JSON objects equivalence_relation (str): Description of what makes two rows equivalent/duplicates session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. strategy (DedupeOperationStrategy | Unset): Strategy for handling duplicates: 'identify' (cluster only), 'select' (pick best), 'combine' (synthesize combined row) Default: DedupeOperationStrategy.SELECT. strategy_prompt (None | str | Unset): Optional instructions guiding how selection or combining is performed @@ -35,6 +36,7 @@ class DedupeOperation: input_: DedupeOperationInputType2 | list[DedupeOperationInputType1Item] | UUID equivalence_relation: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET strategy: DedupeOperationStrategy | Unset = DedupeOperationStrategy.SELECT strategy_prompt: None | str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -62,6 +64,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + strategy: str | Unset = UNSET if not isinstance(self.strategy, Unset): strategy = self.strategy.value @@ -82,6 +90,8 @@ def to_dict(self) -> dict[str, Any]: ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url if strategy is not UNSET: field_dict["strategy"] = strategy if strategy_prompt is not UNSET: @@ -145,6 +155,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + _strategy = d.pop("strategy", UNSET) strategy: DedupeOperationStrategy | Unset if isinstance(_strategy, Unset): @@ -165,6 +184,7 @@ def _parse_strategy_prompt(data: object) -> None | str | Unset: input_=input_, equivalence_relation=equivalence_relation, session_id=session_id, + webhook_url=webhook_url, strategy=strategy, strategy_prompt=strategy_prompt, ) diff --git a/src/everyrow/generated/models/forecast_operation.py b/src/everyrow/generated/models/forecast_operation.py index e24eeafe..a0fc1954 100644 --- a/src/everyrow/generated/models/forecast_operation.py +++ b/src/everyrow/generated/models/forecast_operation.py @@ -1,53 +1,42 @@ from __future__ import annotations from collections.abc import Mapping -from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator +from typing import TYPE_CHECKING, Any, TypeVar, cast +from uuid import UUID 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.forecast_operation_input_type_1_item import ForecastOperationInputType1Item - from ..models.forecast_operation_input_type_2 import ForecastOperationInputType2 - - - + from ..models.forecast_operation_input_type_1_item import ForecastOperationInputType1Item + from ..models.forecast_operation_input_type_2 import ForecastOperationInputType2 T = TypeVar("T", bound="ForecastOperation") - @_attrs_define class ForecastOperation: - """ - Attributes: - input_ (ForecastOperationInputType2 | list[ForecastOperationInputType1Item] | UUID): The input data as a) the ID - of an existing artifact, b) a single record in the form of a JSON object, or c) a table of records in the form - of a list of JSON objects - task (str): Overall context or instructions for the forecast. Each row in the input should contain the - question/scenario to forecast. - session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. - """ + """ + Attributes: + input_ (ForecastOperationInputType2 | list[ForecastOperationInputType1Item] | UUID): The input data as a) the ID + of an existing artifact, b) a single record in the form of a JSON object, or c) a table of records in the form + of a list of JSON objects + task (str): Overall context or instructions for the forecast. Each row in the input should contain the + question/scenario to forecast. + session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. + """ input_: ForecastOperationInputType2 | list[ForecastOperationInputType1Item] | UUID task: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - - - def to_dict(self) -> dict[str, Any]: - from ..models.forecast_operation_input_type_2 import ForecastOperationInputType2 - from ..models.forecast_operation_input_type_1_item import ForecastOperationInputType1Item input_: dict[str, Any] | list[dict[str, Any]] | str if isinstance(self.input_, UUID): input_ = str(self.input_) @@ -57,11 +46,9 @@ def to_dict(self) -> dict[str, Any]: input_type_1_item = input_type_1_item_data.to_dict() input_.append(input_type_1_item) - else: input_ = self.input_.to_dict() - task = self.task session_id: None | str | Unset @@ -72,33 +59,40 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) - field_dict.update({ - "input": input_, - "task": task, - }) + field_dict.update( + { + "input": input_, + "task": task, + } + ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url return field_dict - - @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: from ..models.forecast_operation_input_type_1_item import ForecastOperationInputType1Item from ..models.forecast_operation_input_type_2 import ForecastOperationInputType2 + d = dict(src_dict) + def _parse_input_(data: object) -> ForecastOperationInputType2 | list[ForecastOperationInputType1Item] | UUID: try: if not isinstance(data, str): raise TypeError() input_type_0 = UUID(data) - - return input_type_0 except (TypeError, ValueError, AttributeError, KeyError): pass @@ -107,11 +101,9 @@ def _parse_input_(data: object) -> ForecastOperationInputType2 | list[ForecastOp raise TypeError() input_type_1 = [] _input_type_1 = data - for input_type_1_item_data in (_input_type_1): + for input_type_1_item_data in _input_type_1: input_type_1_item = ForecastOperationInputType1Item.from_dict(input_type_1_item_data) - - input_type_1.append(input_type_1_item) return input_type_1 @@ -121,13 +113,10 @@ def _parse_input_(data: object) -> ForecastOperationInputType2 | list[ForecastOp raise TypeError() input_type_2 = ForecastOperationInputType2.from_dict(data) - - return input_type_2 input_ = _parse_input_(d.pop("input")) - task = d.pop("task") def _parse_session_id(data: object) -> None | Unset | UUID: @@ -140,8 +129,6 @@ def _parse_session_id(data: object) -> None | Unset | UUID: raise TypeError() session_id_type_0 = UUID(data) - - return session_id_type_0 except (TypeError, ValueError, AttributeError, KeyError): pass @@ -149,14 +136,22 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) forecast_operation = cls( input_=input_, task=task, session_id=session_id, + webhook_url=webhook_url, ) - forecast_operation.additional_properties = d return forecast_operation diff --git a/src/everyrow/generated/models/forecast_operation_input_type_1_item.py b/src/everyrow/generated/models/forecast_operation_input_type_1_item.py index 44d2ea5d..9a73381a 100644 --- a/src/everyrow/generated/models/forecast_operation_input_type_1_item.py +++ b/src/everyrow/generated/models/forecast_operation_input_type_1_item.py @@ -1,49 +1,30 @@ from __future__ import annotations from collections.abc import Mapping -from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator +from typing import Any, TypeVar from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import UNSET, Unset - - - - - - - T = TypeVar("T", bound="ForecastOperationInputType1Item") - @_attrs_define class ForecastOperationInputType1Item: - """ - """ + """ """ 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) - forecast_operation_input_type_1_item = cls( - ) - + forecast_operation_input_type_1_item = cls() forecast_operation_input_type_1_item.additional_properties = d return forecast_operation_input_type_1_item diff --git a/src/everyrow/generated/models/forecast_operation_input_type_2.py b/src/everyrow/generated/models/forecast_operation_input_type_2.py index 798673b2..d1272146 100644 --- a/src/everyrow/generated/models/forecast_operation_input_type_2.py +++ b/src/everyrow/generated/models/forecast_operation_input_type_2.py @@ -1,49 +1,30 @@ from __future__ import annotations from collections.abc import Mapping -from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator +from typing import Any, TypeVar from attrs import define as _attrs_define from attrs import field as _attrs_field -from ..types import UNSET, Unset - - - - - - - T = TypeVar("T", bound="ForecastOperationInputType2") - @_attrs_define class ForecastOperationInputType2: - """ - """ + """ """ 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) - forecast_operation_input_type_2 = cls( - ) - + forecast_operation_input_type_2 = cls() forecast_operation_input_type_2.additional_properties = d return forecast_operation_input_type_2 diff --git a/src/everyrow/generated/models/llm_enum_public.py b/src/everyrow/generated/models/llm_enum_public.py index dc735e91..c3fef9e5 100644 --- a/src/everyrow/generated/models/llm_enum_public.py +++ b/src/everyrow/generated/models/llm_enum_public.py @@ -23,6 +23,9 @@ class LLMEnumPublic(str, Enum): CLAUDE_4_6_SONNET_MAX = "CLAUDE_4_6_SONNET_MAX" CLAUDE_4_6_SONNET_MEDIUM = "CLAUDE_4_6_SONNET_MEDIUM" CLAUDE_4_6_SONNET_NT = "CLAUDE_4_6_SONNET_NT" + GEMINI_3_1_PRO_HIGH = "GEMINI_3_1_PRO_HIGH" + GEMINI_3_1_PRO_LOW = "GEMINI_3_1_PRO_LOW" + GEMINI_3_1_PRO_MEDIUM = "GEMINI_3_1_PRO_MEDIUM" GEMINI_3_FLASH_HIGH = "GEMINI_3_FLASH_HIGH" GEMINI_3_FLASH_LOW = "GEMINI_3_FLASH_LOW" GEMINI_3_FLASH_MEDIUM = "GEMINI_3_FLASH_MEDIUM" diff --git a/src/everyrow/generated/models/merge_operation.py b/src/everyrow/generated/models/merge_operation.py index 01fca9df..12612905 100644 --- a/src/everyrow/generated/models/merge_operation.py +++ b/src/everyrow/generated/models/merge_operation.py @@ -39,6 +39,7 @@ class MergeOperation: 'many_to_one' (default) allows multiple left rows to match the same right row, 'one_to_one' enforces unique matches and resolves clashes Default: MergeOperationRelationshipTypeType0.MANY_TO_ONE. session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. """ left_input: list[MergeOperationLeftInputType1Item] | MergeOperationLeftInputType2 | UUID @@ -51,6 +52,7 @@ class MergeOperation: MergeOperationRelationshipTypeType0.MANY_TO_ONE ) session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: @@ -116,6 +118,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) field_dict.update( @@ -135,6 +143,8 @@ def to_dict(self) -> dict[str, Any]: field_dict["relationship_type"] = relationship_type if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url return field_dict @@ -282,6 +292,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + merge_operation = cls( left_input=left_input, right_input=right_input, @@ -291,6 +310,7 @@ def _parse_session_id(data: object) -> None | Unset | UUID: use_web_search=use_web_search, relationship_type=relationship_type, session_id=session_id, + webhook_url=webhook_url, ) merge_operation.additional_properties = d diff --git a/src/everyrow/generated/models/public_task_type.py b/src/everyrow/generated/models/public_task_type.py index 2246f06a..f1728cdd 100644 --- a/src/everyrow/generated/models/public_task_type.py +++ b/src/everyrow/generated/models/public_task_type.py @@ -3,6 +3,7 @@ class PublicTaskType(str, Enum): AGENT = "agent" + CLASSIFY = "classify" DEDUPE = "dedupe" FORECAST = "forecast" MERGE = "merge" diff --git a/src/everyrow/generated/models/rank_operation.py b/src/everyrow/generated/models/rank_operation.py index 0d89cc9d..5aeeae10 100644 --- a/src/everyrow/generated/models/rank_operation.py +++ b/src/everyrow/generated/models/rank_operation.py @@ -28,6 +28,7 @@ class RankOperation: task (str): Instructions for the AI to score each row sort_by (str): Field name from response_schema to sort results by session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. response_schema (None | RankOperationResponseSchemaType0 | Unset): JSON Schema for the response. Must include the field specified in sort_by. ascending (bool | Unset): Sort order: True for ascending, False for descending Default: True. @@ -37,6 +38,7 @@ class RankOperation: task: str sort_by: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET response_schema: None | RankOperationResponseSchemaType0 | Unset = UNSET ascending: bool | Unset = True additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -68,6 +70,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + response_schema: dict[str, Any] | None | Unset if isinstance(self.response_schema, Unset): response_schema = UNSET @@ -89,6 +97,8 @@ def to_dict(self) -> dict[str, Any]: ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url if response_schema is not UNSET: field_dict["response_schema"] = response_schema if ascending is not UNSET: @@ -155,6 +165,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + def _parse_response_schema(data: object) -> None | RankOperationResponseSchemaType0 | Unset: if data is None: return data @@ -179,6 +198,7 @@ def _parse_response_schema(data: object) -> None | RankOperationResponseSchemaTy task=task, sort_by=sort_by, session_id=session_id, + webhook_url=webhook_url, response_schema=response_schema, ascending=ascending, ) diff --git a/src/everyrow/generated/models/screen_operation.py b/src/everyrow/generated/models/screen_operation.py index f76e8313..8514ff38 100644 --- a/src/everyrow/generated/models/screen_operation.py +++ b/src/everyrow/generated/models/screen_operation.py @@ -27,6 +27,7 @@ class ScreenOperation: list of JSON objects task (str): Instructions for the AI to filter/screen each row session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. response_schema (None | ScreenOperationResponseSchemaType0 | Unset): JSON Schema for the response format. If not provided, uses default answer schema. """ @@ -34,6 +35,7 @@ class ScreenOperation: input_: list[ScreenOperationInputType1Item] | ScreenOperationInputType2 | UUID task: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET response_schema: None | ScreenOperationResponseSchemaType0 | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -62,6 +64,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + response_schema: dict[str, Any] | None | Unset if isinstance(self.response_schema, Unset): response_schema = UNSET @@ -80,6 +88,8 @@ def to_dict(self) -> dict[str, Any]: ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url if response_schema is not UNSET: field_dict["response_schema"] = response_schema @@ -142,6 +152,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + def _parse_response_schema(data: object) -> None | ScreenOperationResponseSchemaType0 | Unset: if data is None: return data @@ -163,6 +182,7 @@ def _parse_response_schema(data: object) -> None | ScreenOperationResponseSchema input_=input_, task=task, session_id=session_id, + webhook_url=webhook_url, response_schema=response_schema, ) diff --git a/src/everyrow/generated/models/session_list_item.py b/src/everyrow/generated/models/session_list_item.py index c60bc40a..55f4d852 100644 --- a/src/everyrow/generated/models/session_list_item.py +++ b/src/everyrow/generated/models/session_list_item.py @@ -7,6 +7,7 @@ from attrs import define as _attrs_define from attrs import field as _attrs_field +from dateutil.parser import isoparse T = TypeVar("T", bound="SessionListItem") @@ -15,8 +16,8 @@ class SessionListItem: """ Attributes: - session_id (UUID): The ID of the session - name (str): The name of the session + session_id (UUID): The session ID + name (str): Name of the session created_at (datetime.datetime): When the session was created updated_at (datetime.datetime): When the session was last updated """ @@ -29,8 +30,11 @@ class SessionListItem: def to_dict(self) -> dict[str, Any]: session_id = str(self.session_id) + name = self.name + created_at = self.created_at.isoformat() + updated_at = self.updated_at.isoformat() field_dict: dict[str, Any] = {} @@ -50,9 +54,12 @@ def to_dict(self) -> dict[str, Any]: def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: d = dict(src_dict) session_id = UUID(d.pop("session_id")) + name = d.pop("name") - created_at = datetime.datetime.fromisoformat(d.pop("created_at")) - updated_at = datetime.datetime.fromisoformat(d.pop("updated_at")) + + created_at = isoparse(d.pop("created_at")) + + updated_at = isoparse(d.pop("updated_at")) session_list_item = cls( session_id=session_id, diff --git a/src/everyrow/generated/models/session_list_response.py b/src/everyrow/generated/models/session_list_response.py index 19cc6cdc..dc26a310 100644 --- a/src/everyrow/generated/models/session_list_response.py +++ b/src/everyrow/generated/models/session_list_response.py @@ -7,7 +7,8 @@ from attrs import field as _attrs_field if TYPE_CHECKING: - from .session_list_item import SessionListItem + from ..models.session_list_item import SessionListItem + T = TypeVar("T", bound="SessionListResponse") @@ -16,14 +17,17 @@ class SessionListResponse: """ Attributes: - sessions (list['SessionListItem']): The list of sessions + sessions (list[SessionListItem]): List of sessions """ sessions: list[SessionListItem] additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: - sessions = [s.to_dict() for s in self.sessions] + sessions = [] + for sessions_item_data in self.sessions: + sessions_item = sessions_item_data.to_dict() + sessions.append(sessions_item) field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -37,10 +41,15 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - from .session_list_item import SessionListItem + from ..models.session_list_item import SessionListItem d = dict(src_dict) - sessions = [SessionListItem.from_dict(s) for s in d.pop("sessions")] + sessions = [] + _sessions = d.pop("sessions") + for sessions_item_data in _sessions: + sessions_item = SessionListItem.from_dict(sessions_item_data) + + sessions.append(sessions_item) session_list_response = cls( sessions=sessions, diff --git a/src/everyrow/generated/models/single_agent_operation.py b/src/everyrow/generated/models/single_agent_operation.py index 9a720a09..501e9ecc 100644 --- a/src/everyrow/generated/models/single_agent_operation.py +++ b/src/everyrow/generated/models/single_agent_operation.py @@ -29,6 +29,7 @@ class SingleAgentOperation: form of a list of JSON objects task (str): Instructions for the AI agent session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task. + webhook_url (None | str | Unset): Optional URL to receive a POST callback when the task completes or fails. response_schema (None | SingleAgentOperationResponseSchemaType0 | Unset): JSON Schema for the response format. If not provided, use default answer schema. llm (LLMEnumPublic | None | Unset): LLM to use for the agent. Required when effort_level is not set. @@ -48,6 +49,7 @@ class SingleAgentOperation: input_: list[SingleAgentOperationInputType1Item] | SingleAgentOperationInputType2 | UUID task: str session_id: None | Unset | UUID = UNSET + webhook_url: None | str | Unset = UNSET response_schema: None | SingleAgentOperationResponseSchemaType0 | Unset = UNSET llm: LLMEnumPublic | None | Unset = UNSET effort_level: None | PublicEffortLevel | Unset = UNSET @@ -82,6 +84,12 @@ def to_dict(self) -> dict[str, Any]: else: session_id = self.session_id + webhook_url: None | str | Unset + if isinstance(self.webhook_url, Unset): + webhook_url = UNSET + else: + webhook_url = self.webhook_url + response_schema: dict[str, Any] | None | Unset if isinstance(self.response_schema, Unset): response_schema = UNSET @@ -136,6 +144,8 @@ def to_dict(self) -> dict[str, Any]: ) if session_id is not UNSET: field_dict["session_id"] = session_id + if webhook_url is not UNSET: + field_dict["webhook_url"] = webhook_url if response_schema is not UNSET: field_dict["response_schema"] = response_schema if llm is not UNSET: @@ -212,6 +222,15 @@ def _parse_session_id(data: object) -> None | Unset | UUID: session_id = _parse_session_id(d.pop("session_id", UNSET)) + def _parse_webhook_url(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + webhook_url = _parse_webhook_url(d.pop("webhook_url", UNSET)) + def _parse_response_schema(data: object) -> None | SingleAgentOperationResponseSchemaType0 | Unset: if data is None: return data @@ -296,6 +315,7 @@ def _parse_include_research(data: object) -> bool | None | Unset: input_=input_, task=task, session_id=session_id, + webhook_url=webhook_url, response_schema=response_schema, llm=llm, effort_level=effort_level, From 660a9f665ded70ad43d3fc191ea6c15af8a7bff2 Mon Sep 17 00:00:00 2001 From: Robert Gambee Date: Tue, 24 Feb 2026 18:10:15 -0500 Subject: [PATCH 2/2] Run ruff format --- docs-site/scripts/validate-notebook-patterns.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs-site/scripts/validate-notebook-patterns.py b/docs-site/scripts/validate-notebook-patterns.py index ee805a73..20a05e84 100644 --- a/docs-site/scripts/validate-notebook-patterns.py +++ b/docs-site/scripts/validate-notebook-patterns.py @@ -129,9 +129,7 @@ def check_create_session_wrapping(code_cells: list[str]) -> list[str]: return [] # No everyrow ops used, nothing to check # Check that create_session is used with a name - has_create_session = bool( - re.search(r"create_session\s*\(\s*name\s*=", all_code) - ) + has_create_session = bool(re.search(r"create_session\s*\(\s*name\s*=", all_code)) if not has_create_session: errors.append( "everyrow operations found but not wrapped in " @@ -146,7 +144,7 @@ def check_create_session_wrapping(code_cells: list[str]) -> list[str]: if not has_observability: errors.append( "Missing session observability. " - "Add `print(f\"Session URL: {session.get_url()}\")` inside the create_session block." + 'Add `print(f"Session URL: {session.get_url()}")` inside the create_session block.' ) return errors