everyrow 0.1.10__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. everyrow/__init__.py +8 -1
  2. everyrow/api_utils.py +5 -1
  3. everyrow/billing.py +29 -0
  4. everyrow/constants.py +1 -1
  5. everyrow/generated/__init__.py +1 -1
  6. everyrow/generated/api/{default/interrupt_chat_task_tasks_chat_interrupt_post.py → artifacts/create_artifact_artifacts_post.py} +38 -32
  7. everyrow/generated/api/billing/__init__.py +1 -0
  8. everyrow/generated/api/{default/get_queues_stats_jobs_queues_get.py → billing/get_billing_balance_billing_get.py} +25 -17
  9. everyrow/generated/api/operations/__init__.py +1 -0
  10. everyrow/generated/api/{default/re_execute_task_endpoint_tasks_re_execute_post.py → operations/agent_map_operations_agent_map_post.py} +53 -41
  11. everyrow/generated/api/{default/create_workflow_from_artifact_workflows_from_artifact_post.py → operations/dedupe_operations_dedupe_post.py} +39 -33
  12. everyrow/generated/api/{default/submit_task_tasks_post.py → operations/merge_operations_merge_post.py} +37 -29
  13. everyrow/generated/api/{default/copy_workflow_endpoint_workflows_copy_post.py → operations/rank_operations_rank_post.py} +43 -29
  14. everyrow/generated/api/{default/export_to_google_sheets_export_post.py → operations/screen_operations_screen_post.py} +43 -31
  15. everyrow/generated/api/operations/single_agent_operations_single_agent_post.py +236 -0
  16. everyrow/generated/api/sessions/__init__.py +1 -0
  17. everyrow/generated/api/{default/copy_artifacts_artifacts_copy_post.py → sessions/create_session_endpoint_sessions_post.py} +35 -27
  18. everyrow/generated/api/tasks/__init__.py +1 -0
  19. everyrow/generated/api/{default/get_job_progress_for_task_jobs_progress_get.py → tasks/get_task_result_tasks_task_id_result_get.py} +45 -33
  20. everyrow/generated/api/{default/get_task_status_endpoint_tasks_task_id_status_get.py → tasks/get_task_status_tasks_task_id_status_get.py} +24 -42
  21. everyrow/generated/models/__init__.py +82 -266
  22. everyrow/generated/models/agent_map_operation.py +315 -0
  23. everyrow/generated/models/{artifact_group_record_metadata_type_0.py → agent_map_operation_input_type_1_item.py} +5 -5
  24. everyrow/generated/models/agent_map_operation_input_type_2.py +46 -0
  25. everyrow/generated/models/{standalone_artifact_record_analysis_type_0.py → agent_map_operation_response_schema_type_0.py} +5 -5
  26. everyrow/generated/models/{create_query_params.py → billing_response.py} +13 -12
  27. everyrow/generated/models/{continue_task_request.py → create_artifact_request.py} +43 -43
  28. everyrow/generated/models/create_artifact_request_data_type_0_item.py +46 -0
  29. everyrow/generated/models/{task_metadata_cols_to_rename_type_0.py → create_artifact_request_data_type_1.py} +5 -5
  30. everyrow/generated/models/{copy_artifacts_response.py → create_artifact_response.py} +12 -12
  31. everyrow/generated/models/{create_session_request.py → create_session.py} +6 -7
  32. everyrow/generated/models/dedupe_operation.py +151 -0
  33. everyrow/generated/models/dedupe_operation_input_type_1_item.py +46 -0
  34. everyrow/generated/models/{import_request_token_data.py → dedupe_operation_input_type_2.py} +5 -5
  35. everyrow/generated/models/error_response.py +109 -0
  36. everyrow/generated/models/{task_insert_query_params.py → error_response_details_type_0.py} +5 -5
  37. everyrow/generated/models/insufficient_balance_error.py +8 -0
  38. everyrow/generated/models/{llm_enum.py → llm_enum_public.py} +1 -20
  39. everyrow/generated/models/merge_operation.py +278 -0
  40. everyrow/generated/models/merge_operation_left_input_type_1_item.py +46 -0
  41. everyrow/generated/models/{chat_completion_message_tool_call.py → merge_operation_left_input_type_2.py} +5 -5
  42. everyrow/generated/models/merge_operation_right_input_type_1_item.py +46 -0
  43. everyrow/generated/models/merge_operation_right_input_type_2.py +46 -0
  44. everyrow/generated/models/merge_operation_use_web_search_type_0.py +10 -0
  45. everyrow/generated/models/operation_response.py +131 -0
  46. everyrow/generated/models/{multi_agent_effort_level.py → public_effort_level.py} +1 -1
  47. everyrow/generated/models/public_task_type.py +12 -0
  48. everyrow/generated/models/rank_operation.py +203 -0
  49. everyrow/generated/models/rank_operation_input_type_1_item.py +46 -0
  50. everyrow/generated/models/{export_request_token_data.py → rank_operation_input_type_2.py} +5 -5
  51. everyrow/generated/models/{artifact_group_record_analysis_type_0.py → rank_operation_response_schema_type_0.py} +5 -5
  52. everyrow/generated/models/screen_operation.py +186 -0
  53. everyrow/generated/models/screen_operation_input_type_1_item.py +46 -0
  54. everyrow/generated/models/screen_operation_input_type_2.py +46 -0
  55. everyrow/generated/models/screen_operation_response_schema_type_0.py +46 -0
  56. everyrow/generated/models/{create_session_response.py → session_response.py} +7 -8
  57. everyrow/generated/models/single_agent_operation.py +304 -0
  58. everyrow/generated/models/single_agent_operation_input_type_1_item.py +46 -0
  59. everyrow/generated/models/single_agent_operation_input_type_2.py +46 -0
  60. everyrow/generated/models/single_agent_operation_response_schema_type_0.py +46 -0
  61. everyrow/generated/models/task_result_response.py +185 -0
  62. everyrow/generated/models/task_result_response_data_type_0_item.py +46 -0
  63. everyrow/generated/models/task_result_response_data_type_1.py +46 -0
  64. everyrow/generated/models/task_status_response.py +99 -19
  65. everyrow/ops.py +360 -434
  66. everyrow/session.py +5 -7
  67. everyrow/task.py +68 -115
  68. {everyrow-0.1.10.dist-info → everyrow-0.2.0.dist-info}/METADATA +22 -8
  69. everyrow-0.2.0.dist-info/RECORD +81 -0
  70. everyrow/citations.py +0 -50
  71. everyrow/generated/api/default/continue_task_endpoint_tasks_continue_post.py +0 -208
  72. everyrow/generated/api/default/create_api_key_endpoint_api_keys_create_post.py +0 -186
  73. everyrow/generated/api/default/create_session_endpoint_sessions_create_post.py +0 -198
  74. everyrow/generated/api/default/generate_feedback_endpoint_tasks_generate_feedback_post.py +0 -186
  75. everyrow/generated/api/default/get_artifacts_artifacts_get.py +0 -260
  76. everyrow/generated/api/default/get_default_timeout_seconds_models_default_timeout_seconds_get.py +0 -165
  77. everyrow/generated/api/default/get_metrics_metrics_get.py +0 -80
  78. everyrow/generated/api/default/get_user_usage_usage_get.py +0 -123
  79. everyrow/generated/api/default/healthz_healthz_get.py +0 -127
  80. everyrow/generated/api/default/import_from_google_sheets_import_post.py +0 -170
  81. everyrow/generated/api/default/list_api_keys_endpoint_api_keys_get.py +0 -186
  82. everyrow/generated/api/default/revoke_api_key_endpoint_api_keys_key_id_revoke_post.py +0 -181
  83. everyrow/generated/api/default/revoke_jobs_for_task_jobs_revoke_post.py +0 -164
  84. everyrow/generated/api/default/rollback_to_message_endpoint_tasks_chat_rollback_post.py +0 -186
  85. everyrow/generated/api/default/submit_chat_task_tasks_chat_post.py +0 -164
  86. everyrow/generated/api/default/task_resource_estimation_task_resource_estimation_post.py +0 -319
  87. everyrow/generated/api/default/trigger_workflow_execution_endpoint_workflows_trigger_post.py +0 -166
  88. everyrow/generated/api/default/whoami_whoami_get.py +0 -127
  89. everyrow/generated/models/agent_improvement_instruction.py +0 -69
  90. everyrow/generated/models/agent_query_params.py +0 -383
  91. everyrow/generated/models/agent_query_params_system_prompt_kind_type_0.py +0 -10
  92. everyrow/generated/models/agent_task_args.py +0 -163
  93. everyrow/generated/models/agent_task_args_processing_mode.py +0 -9
  94. everyrow/generated/models/allowed_suggestions.py +0 -9
  95. everyrow/generated/models/api_key_info.py +0 -163
  96. everyrow/generated/models/artifact_changed_payload.py +0 -89
  97. everyrow/generated/models/artifact_group_record.py +0 -363
  98. everyrow/generated/models/artifact_group_record_trace_mapping_type_0.py +0 -46
  99. everyrow/generated/models/artifact_status.py +0 -14
  100. everyrow/generated/models/auto_cohort_conversation_message.py +0 -533
  101. everyrow/generated/models/aux_data.py +0 -128
  102. everyrow/generated/models/aux_data_source_bank.py +0 -59
  103. everyrow/generated/models/chat_message_metadata.py +0 -193
  104. everyrow/generated/models/concatenate_query_params.py +0 -46
  105. everyrow/generated/models/concatenate_request.py +0 -306
  106. everyrow/generated/models/continue_reason.py +0 -9
  107. everyrow/generated/models/controller_improvement_round.py +0 -79
  108. everyrow/generated/models/conversation_changed_payload.py +0 -89
  109. everyrow/generated/models/copy_artifacts_request.py +0 -70
  110. everyrow/generated/models/copy_workflow_request.py +0 -62
  111. everyrow/generated/models/copy_workflow_response.py +0 -70
  112. everyrow/generated/models/create_api_key_request.py +0 -95
  113. everyrow/generated/models/create_api_key_response.py +0 -96
  114. everyrow/generated/models/create_group_query_params.py +0 -61
  115. everyrow/generated/models/create_group_request.py +0 -305
  116. everyrow/generated/models/create_request.py +0 -305
  117. everyrow/generated/models/create_workflow_from_artifact_request.py +0 -92
  118. everyrow/generated/models/create_workflow_from_artifact_response.py +0 -70
  119. everyrow/generated/models/data_frame_method.py +0 -18
  120. everyrow/generated/models/date_cutoffs.py +0 -145
  121. everyrow/generated/models/dedupe_public_params.py +0 -64
  122. everyrow/generated/models/dedupe_request_params.py +0 -311
  123. everyrow/generated/models/deep_merge_public_params.py +0 -143
  124. everyrow/generated/models/deep_merge_request.py +0 -313
  125. everyrow/generated/models/deep_rank_public_params.py +0 -109
  126. everyrow/generated/models/deep_rank_request.py +0 -313
  127. everyrow/generated/models/deep_screen_public_params.py +0 -132
  128. everyrow/generated/models/deep_screen_request.py +0 -313
  129. everyrow/generated/models/derive_expression.py +0 -69
  130. everyrow/generated/models/derive_query_params.py +0 -75
  131. everyrow/generated/models/derive_request.py +0 -307
  132. everyrow/generated/models/document_query_tool.py +0 -12
  133. everyrow/generated/models/drop_columns_query_params.py +0 -61
  134. everyrow/generated/models/drop_columns_request.py +0 -305
  135. everyrow/generated/models/event_type.py +0 -14
  136. everyrow/generated/models/execution_metadata.py +0 -146
  137. everyrow/generated/models/export_request.py +0 -75
  138. everyrow/generated/models/export_to_google_sheets_export_post_response_export_to_google_sheets_export_post.py +0 -46
  139. everyrow/generated/models/filter_query_params.py +0 -91
  140. everyrow/generated/models/filter_request.py +0 -305
  141. everyrow/generated/models/flatten_query_params.py +0 -46
  142. everyrow/generated/models/flatten_request.py +0 -305
  143. everyrow/generated/models/generate_feedback_request.py +0 -62
  144. everyrow/generated/models/group_by_query_params.py +0 -62
  145. everyrow/generated/models/group_by_request.py +0 -305
  146. everyrow/generated/models/healthz_healthz_get_response_healthz_healthz_get.py +0 -46
  147. everyrow/generated/models/image_chat_content_part.py +0 -80
  148. everyrow/generated/models/image_chat_content_part_image_url.py +0 -46
  149. everyrow/generated/models/import_from_google_sheets_import_post_response_import_from_google_sheets_import_post.py +0 -46
  150. everyrow/generated/models/import_request.py +0 -83
  151. everyrow/generated/models/join_query_params.py +0 -73
  152. everyrow/generated/models/join_request.py +0 -305
  153. everyrow/generated/models/map_agent_request_params.py +0 -313
  154. everyrow/generated/models/map_multi_agent_request_params.py +0 -313
  155. everyrow/generated/models/message_created_payload.py +0 -98
  156. everyrow/generated/models/multi_agent_query_params.py +0 -264
  157. everyrow/generated/models/multi_modal_chat_message.py +0 -160
  158. everyrow/generated/models/multi_modal_chat_message_role.py +0 -10
  159. everyrow/generated/models/preview_metadata.py +0 -144
  160. everyrow/generated/models/processing_mode.py +0 -10
  161. everyrow/generated/models/progress_status.py +0 -83
  162. everyrow/generated/models/queue_stats.py +0 -77
  163. everyrow/generated/models/reduce_agent_request_params.py +0 -305
  164. everyrow/generated/models/reduce_multi_agent_request_params.py +0 -305
  165. everyrow/generated/models/resource_estimation_response.py +0 -85
  166. everyrow/generated/models/response_schema_type.py +0 -9
  167. everyrow/generated/models/revoke_api_key_response.py +0 -61
  168. everyrow/generated/models/rollback_to_message_request.py +0 -62
  169. everyrow/generated/models/rollback_to_message_response.py +0 -77
  170. everyrow/generated/models/session_changed_payload.py +0 -69
  171. everyrow/generated/models/simple_chat_message.py +0 -121
  172. everyrow/generated/models/simple_chat_message_role.py +0 -10
  173. everyrow/generated/models/simple_chat_message_with_tool_calls.py +0 -156
  174. everyrow/generated/models/source_database_entry.py +0 -92
  175. everyrow/generated/models/standalone_artifact_record.py +0 -311
  176. everyrow/generated/models/standalone_artifact_record_metadata_type_0.py +0 -46
  177. everyrow/generated/models/standalone_artifact_record_trace_mapping_type_0.py +0 -46
  178. everyrow/generated/models/status_count.py +0 -71
  179. everyrow/generated/models/status_count_status.py +0 -13
  180. everyrow/generated/models/submit_chat_task_body.py +0 -497
  181. everyrow/generated/models/submit_chat_task_body_selected_task_type_type_0.py +0 -11
  182. everyrow/generated/models/submit_task_body.py +0 -745
  183. everyrow/generated/models/task_changed_payload.py +0 -105
  184. everyrow/generated/models/task_effort.py +0 -10
  185. everyrow/generated/models/task_id_request.py +0 -62
  186. everyrow/generated/models/task_insert.py +0 -725
  187. everyrow/generated/models/task_metadata.py +0 -323
  188. everyrow/generated/models/task_response.py +0 -62
  189. everyrow/generated/models/task_type.py +0 -31
  190. everyrow/generated/models/text_chat_content_part.py +0 -74
  191. everyrow/generated/models/tool_response_message.py +0 -127
  192. everyrow/generated/models/toolkit_constants.py +0 -80
  193. everyrow/generated/models/trace_changed_payload.py +0 -94
  194. everyrow/generated/models/trace_info.py +0 -78
  195. everyrow/generated/models/trigger_workflow_execution_request.py +0 -112
  196. everyrow/generated/models/trigger_workflow_execution_request_task_params.py +0 -65
  197. everyrow/generated/models/trigger_workflow_execution_request_task_params_additional_property.py +0 -46
  198. everyrow/generated/models/trigger_workflow_execution_response.py +0 -69
  199. everyrow/generated/models/upload_csv_payload.py +0 -310
  200. everyrow/generated/models/upload_csv_query_params.py +0 -114
  201. everyrow/generated/models/usage_response.py +0 -77
  202. everyrow/generated/models/whoami_whoami_get_response_whoami_whoami_get.py +0 -46
  203. everyrow/generated/models/workflow_leaf_node_input.py +0 -70
  204. everyrow-0.1.10.dist-info/RECORD +0 -183
  205. /everyrow/generated/api/{default → artifacts}/__init__.py +0 -0
  206. {everyrow-0.1.10.dist-info → everyrow-0.2.0.dist-info}/WHEEL +0 -0
  207. {everyrow-0.1.10.dist-info → everyrow-0.2.0.dist-info}/licenses/LICENSE.txt +0 -0
everyrow/session.py CHANGED
@@ -5,11 +5,11 @@ from datetime import datetime
5
5
  from uuid import UUID
6
6
 
7
7
  from everyrow.api_utils import create_client, handle_response
8
- from everyrow.generated.api.default import (
9
- create_session_endpoint_sessions_create_post,
8
+ from everyrow.generated.api.sessions import (
9
+ create_session_endpoint_sessions_post,
10
10
  )
11
11
  from everyrow.generated.client import AuthenticatedClient
12
- from everyrow.generated.models.create_session_request import CreateSessionRequest
12
+ from everyrow.generated.models.create_session import CreateSession
13
13
 
14
14
 
15
15
  class Session:
@@ -61,11 +61,9 @@ async def create_session(
61
61
  await client.__aenter__()
62
62
 
63
63
  try:
64
- response = await create_session_endpoint_sessions_create_post.asyncio(
64
+ response = await create_session_endpoint_sessions_post.asyncio(
65
65
  client=client,
66
- body=CreateSessionRequest(
67
- name=name or f"everyrow-sdk-session-{datetime.now().isoformat()}"
68
- ),
66
+ body=CreateSession(name=name or f"everyrow-sdk-session-{datetime.now().isoformat()}"),
69
67
  )
70
68
  response = handle_response(response)
71
69
  session = Session(client=client, session_id=response.session_id)
everyrow/task.py CHANGED
@@ -1,33 +1,36 @@
1
1
  import asyncio
2
- from typing import TypeVar, cast
2
+ from enum import StrEnum
3
+ from typing import TypeVar
3
4
  from uuid import UUID
4
5
 
5
6
  from pandas import DataFrame
6
7
  from pydantic.main import BaseModel
7
8
 
8
9
  from everyrow.api_utils import create_client, handle_response
9
- from everyrow.citations import render_citations_group, render_citations_standalone
10
10
  from everyrow.constants import EveryrowError
11
- from everyrow.generated.api.default import (
12
- get_artifacts_artifacts_get,
13
- get_task_status_endpoint_tasks_task_id_status_get,
14
- submit_task_tasks_post,
11
+ from everyrow.generated.api.tasks import (
12
+ get_task_result_tasks_task_id_result_get,
13
+ get_task_status_tasks_task_id_status_get,
15
14
  )
16
15
  from everyrow.generated.client import AuthenticatedClient
17
16
  from everyrow.generated.models import (
18
- ArtifactGroupRecord,
19
- LLMEnum,
20
- StandaloneArtifactRecord,
21
- TaskEffort,
17
+ LLMEnumPublic,
18
+ TaskResultResponse,
19
+ TaskResultResponseDataType1,
22
20
  TaskStatus,
23
21
  TaskStatusResponse,
24
22
  )
25
- from everyrow.generated.models.submit_task_body import SubmitTaskBody
23
+ from everyrow.generated.types import Unset
26
24
  from everyrow.result import ScalarResult, TableResult
27
25
 
28
- # "export" generated types.
29
- LLM = LLMEnum
30
- EffortLevel = TaskEffort
26
+ LLM = LLMEnumPublic
27
+
28
+
29
+ class EffortLevel(StrEnum):
30
+ LOW = "low"
31
+ MEDIUM = "medium"
32
+ HIGH = "high"
33
+
31
34
 
32
35
  T = TypeVar("T", bound=BaseModel)
33
36
 
@@ -41,71 +44,57 @@ class EveryrowTask[T: BaseModel]:
41
44
  self._is_expand = is_expand
42
45
  self._response_model = response_model
43
46
 
44
- async def submit(
47
+ def set_submitted(
45
48
  self,
46
- body: SubmitTaskBody,
49
+ task_id: UUID,
50
+ session_id: UUID,
47
51
  client: AuthenticatedClient,
48
- ) -> UUID:
49
- task_id = await submit_task(body, client)
52
+ ) -> None:
50
53
  self.task_id = task_id
51
- self.session_id = body.session_id
54
+ self.session_id = session_id
52
55
  self._client = client
53
- return task_id
54
56
 
55
- async def get_status(
56
- self, client: AuthenticatedClient | None = None
57
- ) -> TaskStatusResponse:
57
+ async def get_status(self, client: AuthenticatedClient | None = None) -> TaskStatusResponse:
58
58
  if self.task_id is None:
59
59
  raise EveryrowError("Task must be submitted before fetching status")
60
60
  client = client or self._client
61
61
  if client is None:
62
- raise EveryrowError(
63
- "No client available. Provide a client or use the task within a session context."
64
- )
62
+ raise EveryrowError("No client available. Provide a client or use the task within a session context.")
65
63
  return await get_task_status(self.task_id, client)
66
64
 
67
- async def await_result(
68
- self, client: AuthenticatedClient | None = None
69
- ) -> TableResult | ScalarResult[T]:
65
+ async def await_result(self, client: AuthenticatedClient | None = None) -> TableResult | ScalarResult[T]:
70
66
  if self.task_id is None:
71
67
  raise EveryrowError("Task must be submitted before awaiting result")
72
68
  client = client or self._client
73
69
  if client is None:
74
- raise EveryrowError(
75
- "No client available. Provide a client or use the task within a session context."
76
- )
77
- final_status_response = await await_task_completion(self.task_id, client)
78
- artifact_id = cast(
79
- UUID, final_status_response.artifact_id
80
- ) # we check artifact_id in await_task_completion
70
+ raise EveryrowError("No client available. Provide a client or use the task within a session context.")
71
+ final_status = await await_task_completion(self.task_id, client)
72
+
73
+ result_response = await get_task_result(self.task_id, client)
74
+ artifact_id = result_response.artifact_id
75
+
76
+ if isinstance(artifact_id, Unset) or artifact_id is None:
77
+ raise EveryrowError("Task result has no artifact ID")
78
+
79
+ error = final_status.error if not isinstance(final_status.error, Unset) else None
81
80
 
82
81
  if self._is_map or self._is_expand:
83
- data = await read_table_result(artifact_id, client=client)
82
+ data = _extract_table_data(result_response)
84
83
  return TableResult(
85
84
  artifact_id=artifact_id,
86
85
  data=data,
87
- error=final_status_response.error,
86
+ error=error,
88
87
  )
89
88
  else:
90
- data = await read_scalar_result(
91
- artifact_id, self._response_model, client=client
92
- )
89
+ data = _extract_scalar_data(result_response, self._response_model)
93
90
  return ScalarResult(
94
91
  artifact_id=artifact_id,
95
92
  data=data,
96
- error=final_status_response.error,
93
+ error=error,
97
94
  )
98
95
 
99
96
 
100
- async def submit_task(body: SubmitTaskBody, client: AuthenticatedClient) -> UUID:
101
- response = await submit_task_tasks_post.asyncio(client=client, body=body)
102
- response = handle_response(response)
103
- return response.task_id
104
-
105
-
106
- async def await_task_completion(
107
- task_id: UUID, client: AuthenticatedClient
108
- ) -> TaskStatusResponse:
97
+ async def await_task_completion(task_id: UUID, client: AuthenticatedClient) -> TaskStatusResponse:
109
98
  max_retries = 3
110
99
  retries = 0
111
100
  while True:
@@ -113,9 +102,7 @@ async def await_task_completion(
113
102
  status_response = await get_task_status(task_id, client)
114
103
  except Exception as e:
115
104
  if retries >= max_retries:
116
- raise EveryrowError(
117
- f"Failed to get task status after {max_retries} retries"
118
- ) from e
105
+ raise EveryrowError(f"Failed to get task status after {max_retries} retries") from e
119
106
  retries += 1
120
107
  else:
121
108
  retries = 0
@@ -126,64 +113,42 @@ async def await_task_completion(
126
113
  ):
127
114
  break
128
115
  await asyncio.sleep(1)
129
- if (
130
- status_response.status == TaskStatus.FAILED
131
- or status_response.artifact_id is None
132
- ):
133
- raise EveryrowError(
134
- f"Failed to create input in everyrow: {status_response.error}"
135
- )
116
+
117
+ if status_response.status == TaskStatus.FAILED:
118
+ error_msg = status_response.error if not isinstance(status_response.error, Unset) else "Unknown error"
119
+ raise EveryrowError(f"Task failed: {error_msg}")
120
+
121
+ if status_response.status == TaskStatus.REVOKED:
122
+ raise EveryrowError("Task was revoked")
136
123
 
137
124
  return status_response
138
125
 
139
126
 
140
- async def get_task_status(
141
- task_id: UUID, client: AuthenticatedClient
142
- ) -> TaskStatusResponse:
143
- response = await get_task_status_endpoint_tasks_task_id_status_get.asyncio(
144
- client=client, task_id=task_id
145
- )
127
+ async def get_task_status(task_id: UUID, client: AuthenticatedClient) -> TaskStatusResponse:
128
+ response = await get_task_status_tasks_task_id_status_get.asyncio(task_id=task_id, client=client)
146
129
  response = handle_response(response)
147
130
  return response
148
131
 
149
132
 
150
- async def read_table_result(
151
- artifact_id: UUID,
152
- client: AuthenticatedClient,
153
- ) -> DataFrame:
154
- response = await get_artifacts_artifacts_get.asyncio(
155
- client=client, artifact_ids=[artifact_id]
156
- )
133
+ async def get_task_result(task_id: UUID, client: AuthenticatedClient) -> TaskResultResponse:
134
+ response = await get_task_result_tasks_task_id_result_get.asyncio(task_id=task_id, client=client)
157
135
  response = handle_response(response)
158
- if len(response) != 1:
159
- raise EveryrowError(f"Expected 1 artifact, got {len(response)}")
160
- artifact = response[0]
161
- if not isinstance(artifact, ArtifactGroupRecord):
162
- raise EveryrowError("Expected table result, but got a scalar")
163
-
164
- artifact = render_citations_group(artifact)
165
-
166
- return DataFrame([a.data for a in artifact.artifacts])
136
+ return response
167
137
 
168
138
 
169
- async def read_scalar_result[T: BaseModel](
170
- artifact_id: UUID,
171
- response_model: type[T],
172
- client: AuthenticatedClient,
173
- ) -> T:
174
- response = await get_artifacts_artifacts_get.asyncio(
175
- client=client, artifact_ids=[artifact_id]
176
- )
177
- response = handle_response(response)
178
- if len(response) != 1:
179
- raise EveryrowError(f"Expected 1 artifact, got {len(response)}")
180
- artifact = response[0]
181
- if not isinstance(artifact, StandaloneArtifactRecord):
182
- raise EveryrowError("Expected scalar result, but got a table")
139
+ def _extract_table_data(result: TaskResultResponse) -> DataFrame:
140
+ if isinstance(result.data, list):
141
+ records = [item.additional_properties for item in result.data]
142
+ return DataFrame(records)
143
+ raise EveryrowError("Expected table result (list of records), but got scalar or null")
183
144
 
184
- artifact = render_citations_standalone(artifact)
185
145
 
186
- return response_model(**artifact.data)
146
+ def _extract_scalar_data[T: BaseModel](result: TaskResultResponse, response_model: type[T]) -> T:
147
+ if isinstance(result.data, TaskResultResponseDataType1):
148
+ return response_model(**result.data.additional_properties)
149
+ if isinstance(result.data, list) and len(result.data) == 1:
150
+ return response_model(**result.data[0].additional_properties)
151
+ raise EveryrowError("Expected scalar result, but got table or null")
187
152
 
188
153
 
189
154
  async def fetch_task_data(
@@ -192,9 +157,6 @@ async def fetch_task_data(
192
157
  ) -> DataFrame:
193
158
  """Fetch the result data for a completed task as a pandas DataFrame.
194
159
 
195
- This is a convenience helper that retrieves the table-level group artifact
196
- associated with a task and returns it as a DataFrame.
197
-
198
160
  Args:
199
161
  task_id: The UUID of the task to fetch data for (can be a string or UUID).
200
162
  client: Optional authenticated client. If not provided, one will be created
@@ -205,11 +167,6 @@ async def fetch_task_data(
205
167
 
206
168
  Raises:
207
169
  EveryrowError: If the task has not completed, failed, or has no artifact.
208
-
209
- Example:
210
- >>> from everyrow import fetch_task_data
211
- >>> df = await fetch_task_data("12345678-1234-1234-1234-123456789abc")
212
- >>> print(df.head())
213
170
  """
214
171
  if isinstance(task_id, str):
215
172
  task_id = UUID(task_id)
@@ -219,12 +176,8 @@ async def fetch_task_data(
219
176
 
220
177
  status_response = await get_task_status(task_id, client)
221
178
 
222
- if status_response.status not in (TaskStatus.COMPLETED,):
223
- raise EveryrowError(
224
- f"Task {task_id} is not completed (status: {status_response.status.value}). Error: {status_response.error}"
225
- )
226
-
227
- if status_response.artifact_id is None:
228
- raise EveryrowError(f"Task {task_id} has no associated artifact.")
179
+ if status_response.status != TaskStatus.COMPLETED:
180
+ raise EveryrowError(f"Task {task_id} is not completed (status: {status_response.status.value}).")
229
181
 
230
- return await read_table_result(status_response.artifact_id, client)
182
+ result_response = await get_task_result(task_id, client)
183
+ return _extract_table_data(result_response)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: everyrow
3
- Version: 0.1.10
3
+ Version: 0.2.0
4
4
  Summary: An SDK for everyrow.io: agent ops at spreadsheet scale
5
5
  License-File: LICENSE.txt
6
6
  Requires-Python: >=3.12
@@ -213,7 +213,7 @@ result = await agent_map(
213
213
  print(result.data.head())
214
214
  ```
215
215
 
216
- **More:** [docs](docs/AGENT.md) / [basic usage](docs/case_studies/basic-usage/notebook.ipynb)
216
+ **More:** [docs](docs/reference/RESEARCH.md) / [basic usage](docs/case_studies/basic-usage/notebook.ipynb)
217
217
 
218
218
  ### Derive
219
219
 
@@ -355,11 +355,12 @@ lefthook install
355
355
  ```
356
356
 
357
357
  ```bash
358
- uv run pytest # tests
359
- uv run ruff check . # lint
360
- uv run ruff format . # format
361
- uv run basedpyright # type check
362
- ./generate_openapi.sh # regenerate client
358
+ uv run pytest # unit tests
359
+ uv run --env-file .env pytest -m integration # integration tests (requires EVERYROW_API_KEY)
360
+ uv run ruff check . # lint
361
+ uv run ruff format . # format
362
+ uv run basedpyright # type check
363
+ ./generate_openapi.sh # regenerate client
363
364
  ```
364
365
 
365
366
  ---
@@ -370,4 +371,17 @@ Built by [FutureSearch](https://futuresearch.ai). We kept running into the same
370
371
 
371
372
  [everyrow.io](https://everyrow.io) (app/dashboard) · [case studies](https://futuresearch.ai/solutions/) · [research](https://futuresearch.ai/research/)
372
373
 
373
- MIT license. See [LICENSE.txt](LICENSE.txt).
374
+ **Citing everyrow:** If you use this software in your research, please cite it using the metadata in [CITATION.cff](CITATION.cff) or the BibTeX below:
375
+
376
+ ```bibtex
377
+ @software{everyrow,
378
+ author = {FutureSearch},
379
+ title = {everyrow},
380
+ url = {https://github.com/futuresearch/everyrow-sdk},
381
+ version = {0.2.0},
382
+ year = {2026},
383
+ license = {MIT}
384
+ }
385
+ ```
386
+
387
+ **License** MIT license. See [LICENSE.txt](LICENSE.txt).
@@ -0,0 +1,81 @@
1
+ everyrow/__init__.py,sha256=z8oDcFaWns-sUIzAo063uzHRgPkptz1kAA2LhMTJ2Xw,328
2
+ everyrow/api_utils.py,sha256=Wi3Yd30w11U02T_jt3GINebI2Ievhp8d42NHWxYAI4k,1641
3
+ everyrow/billing.py,sha256=Oc0MsRl2CpnC8tH6srBnmdBNpgdygofKMKTdg8_MsLw,873
4
+ everyrow/constants.py,sha256=oHWD2JAOeRySkf0K824XM6j07AzlTq_SUFvbpetrF1g,94
5
+ everyrow/ops.py,sha256=rQUos96M97kurRHE3kHlvB2LDvYWaoJPj0khQ72BBkI,25906
6
+ everyrow/result.py,sha256=2vCiE17kdbgkYKAdvfkpXJsSCr10U8FdO8NpS8eiofg,413
7
+ everyrow/session.py,sha256=5ZB8bK3VtqC7VMKvKfyA1qKSYylOi-7XeXuSkLMsLRk,2656
8
+ everyrow/task.py,sha256=UdGmt5OPQ4HGhx5iCRG6XlH2iUXZlkF7CV4y7mhDEqQ,6576
9
+ everyrow/generated/__init__.py,sha256=7Zs5P68qSl1JSVmnLh4Uq-czi5SV3Fr7e923BVohTuA,155
10
+ everyrow/generated/client.py,sha256=-rT3epMc77Y7QMTy5o1oH5hkGLufY9qFrD1rb7qItFU,12384
11
+ everyrow/generated/errors.py,sha256=gO8GBmKqmSNgAg-E5oT-oOyxztvp7V_6XG7OUTT15q0,546
12
+ everyrow/generated/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
13
+ everyrow/generated/types.py,sha256=0We4NPvhIYASRpQ3le41nmJeEAVm42-2VKdzlJ4Ogok,1343
14
+ everyrow/generated/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
15
+ everyrow/generated/api/artifacts/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
16
+ everyrow/generated/api/artifacts/create_artifact_artifacts_post.py,sha256=cs7-asfGObxTUtXPAhdeHkA-sqxx9oThAPfyqVYW4Rk,4847
17
+ everyrow/generated/api/billing/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
18
+ everyrow/generated/api/billing/get_billing_balance_billing_get.py,sha256=3ddtkiRKQCEXPYg0Z451Yu8AKymhrl5rflWyMcDahSk,3429
19
+ everyrow/generated/api/operations/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
20
+ everyrow/generated/api/operations/agent_map_operations_agent_map_post.py,sha256=GkW8ihrL5UtYlAmRZNSg85fuHZzql2ifvr0NlgNyb20,6081
21
+ everyrow/generated/api/operations/dedupe_operations_dedupe_post.py,sha256=tUwWJsGBuFVN4wAgNvcnec5TVHVPMu8gqYP8rdBM5VM,5019
22
+ everyrow/generated/api/operations/merge_operations_merge_post.py,sha256=aPZipbvuu_q_oPpPm6fNVbZ0S9NsfEQ9-JafZdwp32Y,4939
23
+ everyrow/generated/api/operations/rank_operations_rank_post.py,sha256=xyJnMZOnkqKqZDxDr8ErVOrVCxVbe1ZbqPa9Edod3cE,4951
24
+ everyrow/generated/api/operations/screen_operations_screen_post.py,sha256=riZ37utYJPBgrlVGPRGRczafIutUNSBy2dps0WAgYuk,5011
25
+ everyrow/generated/api/operations/single_agent_operations_single_agent_post.py,sha256=yVIWTTxbkqQu1lDriYeHvo8qkbRneXPqZ78DlpYn2Tw,7761
26
+ everyrow/generated/api/sessions/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
27
+ everyrow/generated/api/sessions/create_session_endpoint_sessions_post.py,sha256=CLjFKbfV2XD1tqJGTomqXXpMNctylzZ8I0rOL1MvOBA,4376
28
+ everyrow/generated/api/tasks/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
29
+ everyrow/generated/api/tasks/get_task_result_tasks_task_id_result_get.py,sha256=mxRzES_LfgxTCiXdx50i2CXRHgvcDLbJzEIcYwSDGpo,5048
30
+ everyrow/generated/api/tasks/get_task_status_tasks_task_id_status_get.py,sha256=W2FWklD65wEdu72fU5v8wzFb8McZmD32O5o3gzcfPsc,4672
31
+ everyrow/generated/models/__init__.py,sha256=8AfDWIlIpCl2ub3xxXyYLr-KrBd9ZOCvRnMyZ0SwstU,4527
32
+ everyrow/generated/models/agent_map_operation.py,sha256=K4vbipYRizEnUMVTeZcaE_b_81n8fln6RvH5007Av0Q,12671
33
+ everyrow/generated/models/agent_map_operation_input_type_1_item.py,sha256=GgXSAQ4q4Tdw_aysRnHrCojHvmFi4w0Lnl65jLDkrlo,1351
34
+ everyrow/generated/models/agent_map_operation_input_type_2.py,sha256=2Nl3D4Cnb3lSHGhHTMCnQUbcXPK5_aelAIi0LXhwois,1328
35
+ everyrow/generated/models/agent_map_operation_response_schema_type_0.py,sha256=vOwu7fCzhtLJgm_brEvpRbFBp8A9Y0fCXnNBnBlh4bY,1376
36
+ everyrow/generated/models/billing_response.py,sha256=wv8dTv6jZ5F5KjS3M5zwmDcf7r5ROYh5iTUbXWVwwMo,1743
37
+ everyrow/generated/models/create_artifact_request.py,sha256=mZLGtjIILakvViSfFi-jWGWFhf7H2wQtG_KHzQbT4fo,4605
38
+ everyrow/generated/models/create_artifact_request_data_type_0_item.py,sha256=vpQZVjBgmeDT4-799HBreVKeULghq24WKAikYVbSGNc,1366
39
+ everyrow/generated/models/create_artifact_request_data_type_1.py,sha256=WwFB0AKrxqjoNntV3jaAoK4ZPXFnYGZlgxVityIlLlM,1343
40
+ everyrow/generated/models/create_artifact_response.py,sha256=2JSlTpY3sS_DWCjgoBridc6QziBjPuTUrMsiyxkBIZs,1929
41
+ everyrow/generated/models/create_session.py,sha256=wvqS0gYFo1q85Ow3E_uPnRavIjcYLKw1007nEzxnelg,1503
42
+ everyrow/generated/models/dedupe_operation.py,sha256=i6rM5XAifdpvouyCk9MU6e35baragJwznDKULihibLo,5302
43
+ everyrow/generated/models/dedupe_operation_input_type_1_item.py,sha256=nQocF04VEwIM2Mm0YKth7zSMwYAsfq2gWbv_95eJhPU,1338
44
+ everyrow/generated/models/dedupe_operation_input_type_2.py,sha256=SxS0qQuU4nHT9yMW8f-Mu5MlgelfPG5HIrMb_aL6zgA,1315
45
+ everyrow/generated/models/error_response.py,sha256=t1mtTt6dRzXQgit6slBktTzIycqKuWkxLvY6Ba__v54,3284
46
+ everyrow/generated/models/error_response_details_type_0.py,sha256=mSLFizTmH-jTYn09eL5s3e1iI5nAdKWOpHnetKx-UGs,1315
47
+ everyrow/generated/models/http_validation_error.py,sha256=ceDDkSqsvFmTdFwrra6lwo-L-BAHNX8h8bwaKyxPkEk,2317
48
+ everyrow/generated/models/insufficient_balance_error.py,sha256=LqjyKHBPejWM_r1AsrcKmIPLDrWKyLbeHJBVY0nHmj0,2638
49
+ everyrow/generated/models/llm_enum_public.py,sha256=AU2r8aadd-JkwhXVavmCZrRBecuakhNolIy9H8f2fAg,1350
50
+ everyrow/generated/models/merge_operation.py,sha256=AqN5TShJQ7FgGeQKVhnNnTSU-besQurT2f9bL90X6T8,10890
51
+ everyrow/generated/models/merge_operation_left_input_type_1_item.py,sha256=OuaH6nFuq1UQo8NXkmv2GeYLj_sWbvdLFVubnGt5Uhk,1356
52
+ everyrow/generated/models/merge_operation_left_input_type_2.py,sha256=mjY5QnuREiIwV5qi79sWOxoIdSy6FjOHaT3fcOEIuk0,1333
53
+ everyrow/generated/models/merge_operation_right_input_type_1_item.py,sha256=a_XH8yZB9HmTDWGfFAtkCEYCMHhBE5hXRhTwPO3F5rg,1361
54
+ everyrow/generated/models/merge_operation_right_input_type_2.py,sha256=c24_J6xv7ASJP3LzPbML72J3NBFgHemRDYetdB-T4vs,1338
55
+ everyrow/generated/models/merge_operation_use_web_search_type_0.py,sha256=C4pBVJssNaOkfimp86wgbTgKJuBllJ03EqVBTdgzEXk,184
56
+ everyrow/generated/models/operation_response.py,sha256=7iuCVtyHir5AY7SPexeyY_kw_9YBkGVsH2wp_hbpnxk,3918
57
+ everyrow/generated/models/public_effort_level.py,sha256=vPdbY13dO3q0KNKN8OTgXqqQf6v4526zquwlMt0g5V4,178
58
+ everyrow/generated/models/public_task_type.py,sha256=2MCa8Z_zDWOEcUSr6ux08Sc7JEGGtxRbehWdKF2LsXU,221
59
+ everyrow/generated/models/rank_operation.py,sha256=QmVqs83hQdCUzNZ_bBHiPlIfLQWawC3zBLq43j1MRdg,7397
60
+ everyrow/generated/models/rank_operation_input_type_1_item.py,sha256=3jDUXFV87M9NCMHd64QQA5GzW68iQq9O0qnzaB8126I,1328
61
+ everyrow/generated/models/rank_operation_input_type_2.py,sha256=ma5sofRgv9q9PvsBDIWXFGBwGPKICsk6FAYlsf12Dg4,1305
62
+ everyrow/generated/models/rank_operation_response_schema_type_0.py,sha256=dUKIutYuompTBKqYe2znSPJBvfOnjlm2ns2nO_LrRVY,1353
63
+ everyrow/generated/models/screen_operation.py,sha256=gHXaRqV2oHXh-7VJS46yvU1m16hMTOjkLfCowwYJ1bo,6918
64
+ everyrow/generated/models/screen_operation_input_type_1_item.py,sha256=X2kSbeZXRBMjSUEeK0B5E8loRbfkkQiNTpi-HUx9QIw,1338
65
+ everyrow/generated/models/screen_operation_input_type_2.py,sha256=26G_W1Zhx1MEOHoJP7Ty_X9HNVZKwqIAvpzzj-RZsqk,1315
66
+ everyrow/generated/models/screen_operation_response_schema_type_0.py,sha256=3OMoKwmHLK81HgScTsNeL3TPZLajeWMfiRNng4r9DrE,1363
67
+ everyrow/generated/models/session_response.py,sha256=1L27retPnHk_5FCgYpkDJ_8j5zpnIatsRVVkIsXl-5E,1618
68
+ everyrow/generated/models/single_agent_operation.py,sha256=tkXU78MaAWmsySdzSQhMn04pii4G3iWBQf-aBAcw24U,11893
69
+ everyrow/generated/models/single_agent_operation_input_type_1_item.py,sha256=Kze2hVfabLSsB47Vhy5Ck4R6SaPXw5PunB4CkTZNxAc,1366
70
+ everyrow/generated/models/single_agent_operation_input_type_2.py,sha256=fKvpPQM-_N49jqJAdZUwwguv2DW-zWGZCj-hICcLQX0,1343
71
+ everyrow/generated/models/single_agent_operation_response_schema_type_0.py,sha256=Z0gIRLrfZYmZqwDpqqt4iBk7u0_Dg2S-g-skshzPH04,1391
72
+ everyrow/generated/models/task_result_response.py,sha256=3K22Ymj4jLe3YDbmnQHm0PNkzuJDu3iVJuMYMydW8fw,6280
73
+ everyrow/generated/models/task_result_response_data_type_0_item.py,sha256=XTmW7RRPDX07Z4Oqg3JkRY8qrhFwizYtrwYXUAgIvMw,1351
74
+ everyrow/generated/models/task_result_response_data_type_1.py,sha256=BT5NBWuIWtc6RNMqmRvcKrkcNIGo1eWYMsfGykkGuOk,1328
75
+ everyrow/generated/models/task_status.py,sha256=wtFjPLXyNeLQrudS8IJgkQUU_gGx53OdliHlwJhaQPc,237
76
+ everyrow/generated/models/task_status_response.py,sha256=6HDLnc-5MhUgXHisjoobUA6UI9VNortdAW2w1mvuV_s,6086
77
+ everyrow/generated/models/validation_error.py,sha256=n8d_ZobQV26pm0KyDAKvIo93uOBhz2BH59jpJAKwoPY,2180
78
+ everyrow-0.2.0.dist-info/METADATA,sha256=yUdzgHTprrteylODCwwpYqptj5xF-9a8s82GpOGShOE,13090
79
+ everyrow-0.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
80
+ everyrow-0.2.0.dist-info/licenses/LICENSE.txt,sha256=8gN2nA06HyReyL7Mfu9nsBIpUF-B6wL5SJenlMRN8ac,1070
81
+ everyrow-0.2.0.dist-info/RECORD,,
everyrow/citations.py DELETED
@@ -1,50 +0,0 @@
1
- from copy import deepcopy
2
- from typing import Any
3
-
4
- from everyrow.generated.models import (
5
- ArtifactGroupRecord,
6
- AuxDataSourceBank,
7
- StandaloneArtifactRecord,
8
- )
9
- from everyrow.generated.types import Unset
10
-
11
-
12
- def _render_citations(
13
- data: dict[str, Any], source_bank: AuxDataSourceBank
14
- ) -> dict[str, Any]:
15
- result = deepcopy(data)
16
- for source_id, source_data in source_bank.to_dict().items():
17
- for key, value in result.items():
18
- if isinstance(value, str):
19
- result[key] = value.replace(source_id, source_data["url"])
20
- else:
21
- result[key] = value
22
- return result
23
-
24
-
25
- def render_citations_standalone(artifact: StandaloneArtifactRecord):
26
- if isinstance(artifact.aux_data, Unset) or isinstance(
27
- artifact.aux_data.source_bank, Unset
28
- ):
29
- return artifact
30
- source_bank = (
31
- artifact.aux_data.source_bank
32
- ) # create reference simply to make the type checker happy before deepcopy.
33
- artifact = deepcopy(artifact)
34
- artifact.data = _render_citations(artifact.data, source_bank)
35
- return artifact
36
-
37
-
38
- def render_citations_group(artifact: ArtifactGroupRecord) -> ArtifactGroupRecord:
39
- artifact = deepcopy(artifact)
40
- new_artifacts = []
41
- for artifact_item in artifact.artifacts:
42
- if isinstance(artifact_item, StandaloneArtifactRecord):
43
- item_to_add = render_citations_standalone(artifact_item)
44
- elif isinstance(artifact_item, ArtifactGroupRecord):
45
- item_to_add = render_citations_group(artifact_item)
46
- else:
47
- item_to_add = artifact_item
48
- new_artifacts.append(item_to_add)
49
- artifact.artifacts = new_artifacts
50
- return artifact