exa-py 1.14.6__tar.gz → 1.14.8__tar.gz
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.
Potentially problematic release.
This version of exa-py might be problematic. Click here for more details.
- {exa_py-1.14.6 → exa_py-1.14.8}/PKG-INFO +3 -3
- {exa_py-1.14.6 → exa_py-1.14.8}/README.md +2 -2
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/api.py +8 -8
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/__init__.py +2 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/client.py +2 -0
- exa_py-1.14.8/exa_py/websets/imports/__init__.py +3 -0
- exa_py-1.14.8/exa_py/websets/imports/client.py +179 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/types.py +299 -1
- {exa_py-1.14.6 → exa_py-1.14.8}/pyproject.toml +1 -1
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/py.typed +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/research/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/research/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/research/models.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/utils.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/_generator/pydantic/BaseModel.jinja2 +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/core/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/core/base.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/enrichments/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/enrichments/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/items/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/items/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/monitors/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/monitors/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/monitors/runs/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/monitors/runs/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/searches/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/searches/client.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/webhooks/__init__.py +0 -0
- {exa_py-1.14.6 → exa_py-1.14.8}/exa_py/websets/webhooks/client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: exa-py
|
|
3
|
-
Version: 1.14.
|
|
3
|
+
Version: 1.14.8
|
|
4
4
|
Summary: Python SDK for Exa API.
|
|
5
5
|
License: MIT
|
|
6
6
|
Author: Exa AI
|
|
@@ -85,8 +85,8 @@ exa = Exa(api_key="your-api-key")
|
|
|
85
85
|
# basic answer
|
|
86
86
|
response = exa.answer("This is a query to answer a question")
|
|
87
87
|
|
|
88
|
-
# answer with full text
|
|
89
|
-
response = exa.answer("This is a query to answer a question", text=True
|
|
88
|
+
# answer with full text
|
|
89
|
+
response = exa.answer("This is a query to answer a question", text=True)
|
|
90
90
|
|
|
91
91
|
# answer with streaming
|
|
92
92
|
response = exa.stream_answer("This is a query to answer:")
|
|
@@ -63,8 +63,8 @@ exa = Exa(api_key="your-api-key")
|
|
|
63
63
|
# basic answer
|
|
64
64
|
response = exa.answer("This is a query to answer a question")
|
|
65
65
|
|
|
66
|
-
# answer with full text
|
|
67
|
-
response = exa.answer("This is a query to answer a question", text=True
|
|
66
|
+
# answer with full text
|
|
67
|
+
response = exa.answer("This is a query to answer a question", text=True)
|
|
68
68
|
|
|
69
69
|
# answer with streaming
|
|
70
70
|
response = exa.stream_answer("This is a query to answer:")
|
|
@@ -134,7 +134,7 @@ SEARCH_OPTIONS_TYPES = {
|
|
|
134
134
|
list
|
|
135
135
|
], # Must not be present in webpage text. (One string, up to 5 words)
|
|
136
136
|
"use_autoprompt": [bool], # Convert query to Exa. (Default: false)
|
|
137
|
-
"type": [str], # 'keyword', 'neural', or 'auto' (Default: auto)
|
|
137
|
+
"type": [str], # 'keyword', 'neural', 'hybrid', or 'auto' (Default: auto)
|
|
138
138
|
"category": [
|
|
139
139
|
str
|
|
140
140
|
], # A data category to focus on: 'company', 'research paper', 'news', 'pdf', 'github', 'tweet', 'personal site', 'linkedin profile', 'financial report'
|
|
@@ -874,7 +874,7 @@ class Exa:
|
|
|
874
874
|
self,
|
|
875
875
|
api_key: Optional[str],
|
|
876
876
|
base_url: str = "https://api.exa.ai",
|
|
877
|
-
user_agent: str = "exa-py 1.
|
|
877
|
+
user_agent: str = "exa-py 1.14.9",
|
|
878
878
|
):
|
|
879
879
|
"""Initialize the Exa client with the provided API key and optional base URL and user agent.
|
|
880
880
|
|
|
@@ -995,7 +995,7 @@ class Exa:
|
|
|
995
995
|
include_text (List[str], optional): Strings that must appear in the page text.
|
|
996
996
|
exclude_text (List[str], optional): Strings that must not appear in the page text.
|
|
997
997
|
use_autoprompt (bool, optional): Convert query to Exa (default False).
|
|
998
|
-
type (str, optional): 'keyword' or '
|
|
998
|
+
type (str, optional): 'keyword', 'neural', or 'hybrid' (default 'neural').
|
|
999
999
|
category (str, optional): e.g. 'company'
|
|
1000
1000
|
flags (List[str], optional): Experimental flags for Exa usage.
|
|
1001
1001
|
moderation (bool, optional): If True, the search results will be moderated for safety.
|
|
@@ -1909,7 +1909,7 @@ class Exa:
|
|
|
1909
1909
|
query (str): The query to answer.
|
|
1910
1910
|
text (bool, optional): Whether to include full text in the results. Defaults to False.
|
|
1911
1911
|
system_prompt (str, optional): A system prompt to guide the LLM's behavior when generating the answer.
|
|
1912
|
-
model (str, optional): The model to use for answering.
|
|
1912
|
+
model (str, optional): The model to use for answering. Defaults to None.
|
|
1913
1913
|
output_schema (dict[str, Any], optional): JSON schema describing the desired answer structure.
|
|
1914
1914
|
|
|
1915
1915
|
Returns:
|
|
@@ -1948,7 +1948,7 @@ class Exa:
|
|
|
1948
1948
|
query (str): The query to answer.
|
|
1949
1949
|
text (bool): Whether to include full text in the results. Defaults to False.
|
|
1950
1950
|
system_prompt (str, optional): A system prompt to guide the LLM's behavior when generating the answer.
|
|
1951
|
-
model (str, optional): The model to use for answering.
|
|
1951
|
+
model (str, optional): The model to use for answering. Defaults to None.
|
|
1952
1952
|
output_schema (dict[str, Any], optional): JSON schema describing the desired answer structure.
|
|
1953
1953
|
Returns:
|
|
1954
1954
|
StreamAnswerResponse: An object that can be iterated over to retrieve (partial text, partial citations).
|
|
@@ -2040,7 +2040,7 @@ class AsyncExa(Exa):
|
|
|
2040
2040
|
include_text (List[str], optional): Strings that must appear in the page text.
|
|
2041
2041
|
exclude_text (List[str], optional): Strings that must not appear in the page text.
|
|
2042
2042
|
use_autoprompt (bool, optional): Convert query to Exa (default False).
|
|
2043
|
-
type (str, optional): 'keyword' or '
|
|
2043
|
+
type (str, optional): 'keyword', 'neural', or 'hybrid' (default 'neural').
|
|
2044
2044
|
category (str, optional): e.g. 'company'
|
|
2045
2045
|
flags (List[str], optional): Experimental flags for Exa usage.
|
|
2046
2046
|
moderation (bool, optional): If True, the search results will be moderated for safety.
|
|
@@ -2253,7 +2253,7 @@ class AsyncExa(Exa):
|
|
|
2253
2253
|
query (str): The query to answer.
|
|
2254
2254
|
text (bool, optional): Whether to include full text in the results. Defaults to False.
|
|
2255
2255
|
system_prompt (str, optional): A system prompt to guide the LLM's behavior when generating the answer.
|
|
2256
|
-
model (str, optional): The model to use for answering.
|
|
2256
|
+
model (str, optional): The model to use for answering. Defaults to None.
|
|
2257
2257
|
output_schema (dict[str, Any], optional): JSON schema describing the desired answer structure.
|
|
2258
2258
|
|
|
2259
2259
|
Returns:
|
|
@@ -2292,7 +2292,7 @@ class AsyncExa(Exa):
|
|
|
2292
2292
|
query (str): The query to answer.
|
|
2293
2293
|
text (bool): Whether to include full text in the results. Defaults to False.
|
|
2294
2294
|
system_prompt (str, optional): A system prompt to guide the LLM's behavior when generating the answer.
|
|
2295
|
-
model (str, optional): The model to use for answering.
|
|
2295
|
+
model (str, optional): The model to use for answering. Defaults to None.
|
|
2296
2296
|
output_schema (dict[str, Any], optional): JSON schema describing the desired answer structure.
|
|
2297
2297
|
Returns:
|
|
2298
2298
|
AsyncStreamAnswerResponse: An object that can be iterated over to retrieve (partial text, partial citations).
|
|
@@ -17,6 +17,7 @@ from .searches import WebsetSearchesClient
|
|
|
17
17
|
from .enrichments import WebsetEnrichmentsClient
|
|
18
18
|
from .webhooks import WebsetWebhooksClient
|
|
19
19
|
from .monitors import MonitorsClient
|
|
20
|
+
from .imports import ImportsClient
|
|
20
21
|
|
|
21
22
|
class WebsetsClient(WebsetsBaseClient):
|
|
22
23
|
"""Client for managing Websets."""
|
|
@@ -28,6 +29,7 @@ class WebsetsClient(WebsetsBaseClient):
|
|
|
28
29
|
self.enrichments = WebsetEnrichmentsClient(client)
|
|
29
30
|
self.webhooks = WebsetWebhooksClient(client)
|
|
30
31
|
self.monitors = MonitorsClient(client)
|
|
32
|
+
self.imports = ImportsClient(client)
|
|
31
33
|
|
|
32
34
|
def create(self, params: Union[Dict[str, Any], CreateWebsetParameters]) -> Webset:
|
|
33
35
|
"""Create a new Webset.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
import os
|
|
5
|
+
import csv
|
|
6
|
+
import io
|
|
7
|
+
import requests
|
|
8
|
+
from typing import Dict, Any, Union, Optional
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from ..types import (
|
|
12
|
+
CreateImportParameters,
|
|
13
|
+
CreateImportResponse,
|
|
14
|
+
Import,
|
|
15
|
+
ListImportsResponse,
|
|
16
|
+
UpdateImport,
|
|
17
|
+
)
|
|
18
|
+
from ..core.base import WebsetsBaseClient
|
|
19
|
+
|
|
20
|
+
class ImportsClient(WebsetsBaseClient):
|
|
21
|
+
"""Client for managing Imports."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, client):
|
|
24
|
+
super().__init__(client)
|
|
25
|
+
|
|
26
|
+
def create(
|
|
27
|
+
self,
|
|
28
|
+
params: Union[Dict[str, Any], CreateImportParameters],
|
|
29
|
+
*,
|
|
30
|
+
csv_data: Optional[Union[str, Path]] = None
|
|
31
|
+
) -> Union[CreateImportResponse, Import]:
|
|
32
|
+
"""Create a new import to upload your data into Websets.
|
|
33
|
+
|
|
34
|
+
Imports can be used to:
|
|
35
|
+
- Enrich: Enhance your data with additional information using our AI-powered enrichment engine
|
|
36
|
+
- Search: Query your data using Websets' agentic search with natural language filters
|
|
37
|
+
- Exclude: Prevent duplicate or already known results from appearing in your searches
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
params (CreateImportParameters): The parameters for creating an import.
|
|
41
|
+
csv_data (Union[str, Path], optional): CSV data to upload. Can be raw CSV string or file path.
|
|
42
|
+
When provided, size and count will be automatically calculated
|
|
43
|
+
if not specified in params.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
CreateImportResponse: If csv_data is None (traditional usage with upload URL).
|
|
47
|
+
Import: If csv_data is provided (uploaded and processing).
|
|
48
|
+
"""
|
|
49
|
+
if csv_data is not None:
|
|
50
|
+
if isinstance(csv_data, (str, Path)) and os.path.isfile(csv_data):
|
|
51
|
+
with open(csv_data, 'r', encoding='utf-8') as f:
|
|
52
|
+
csv_content = f.read()
|
|
53
|
+
else:
|
|
54
|
+
csv_content = str(csv_data)
|
|
55
|
+
|
|
56
|
+
if isinstance(params, dict):
|
|
57
|
+
current_size = params.get('size')
|
|
58
|
+
current_count = params.get('count')
|
|
59
|
+
else:
|
|
60
|
+
current_size = getattr(params, 'size', None)
|
|
61
|
+
current_count = getattr(params, 'count', None)
|
|
62
|
+
|
|
63
|
+
if current_size is None or current_count is None:
|
|
64
|
+
calculated_size = len(csv_content.encode('utf-8'))
|
|
65
|
+
csv_reader = csv.reader(io.StringIO(csv_content))
|
|
66
|
+
rows = list(csv_reader)
|
|
67
|
+
calculated_count = max(0, len(rows) - 1)
|
|
68
|
+
|
|
69
|
+
if isinstance(params, dict):
|
|
70
|
+
params = params.copy()
|
|
71
|
+
if current_size is None:
|
|
72
|
+
params['size'] = calculated_size
|
|
73
|
+
if current_count is None:
|
|
74
|
+
params['count'] = calculated_count
|
|
75
|
+
else:
|
|
76
|
+
params_dict = params.model_dump()
|
|
77
|
+
if current_size is None:
|
|
78
|
+
params_dict['size'] = calculated_size
|
|
79
|
+
if current_count is None:
|
|
80
|
+
params_dict['count'] = calculated_count
|
|
81
|
+
params = CreateImportParameters.model_validate(params_dict)
|
|
82
|
+
|
|
83
|
+
response = self.request("/v0/imports", data=params)
|
|
84
|
+
import_response = CreateImportResponse.model_validate(response)
|
|
85
|
+
|
|
86
|
+
if csv_data is None:
|
|
87
|
+
return import_response
|
|
88
|
+
|
|
89
|
+
upload_response = requests.put(
|
|
90
|
+
import_response.upload_url,
|
|
91
|
+
data=csv_content,
|
|
92
|
+
headers={'Content-Type': 'text/csv'}
|
|
93
|
+
)
|
|
94
|
+
upload_response.raise_for_status()
|
|
95
|
+
|
|
96
|
+
return self.get(import_response.id)
|
|
97
|
+
|
|
98
|
+
def get(self, import_id: str) -> Import:
|
|
99
|
+
"""Get a specific import.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
import_id (str): The id of the Import.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Import: The retrieved import.
|
|
106
|
+
"""
|
|
107
|
+
response = self.request(f"/v0/imports/{import_id}", method="GET")
|
|
108
|
+
return Import.model_validate(response)
|
|
109
|
+
|
|
110
|
+
def list(self, *, cursor: Optional[str] = None, limit: Optional[int] = None) -> ListImportsResponse:
|
|
111
|
+
"""List all imports.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
cursor (str, optional): The cursor to paginate through the results.
|
|
115
|
+
limit (int, optional): The number of results to return (1-200, default 25).
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
ListImportsResponse: List of imports with pagination info.
|
|
119
|
+
"""
|
|
120
|
+
params = {
|
|
121
|
+
k: v
|
|
122
|
+
for k, v in {
|
|
123
|
+
"cursor": cursor,
|
|
124
|
+
"limit": limit
|
|
125
|
+
}.items()
|
|
126
|
+
if v is not None
|
|
127
|
+
}
|
|
128
|
+
response = self.request("/v0/imports", params=params, method="GET")
|
|
129
|
+
return ListImportsResponse.model_validate(response)
|
|
130
|
+
|
|
131
|
+
def update(self, import_id: str, params: Union[Dict[str, Any], UpdateImport]) -> Import:
|
|
132
|
+
"""Update an import configuration.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
import_id (str): The id of the Import.
|
|
136
|
+
params (UpdateImport): The parameters for updating an import.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Import: The updated import.
|
|
140
|
+
"""
|
|
141
|
+
response = self.request(f"/v0/imports/{import_id}", data=params, method="PATCH")
|
|
142
|
+
return Import.model_validate(response)
|
|
143
|
+
|
|
144
|
+
def delete(self, import_id: str) -> Import:
|
|
145
|
+
"""Delete an import.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
import_id (str): The id of the Import.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Import: The deleted import.
|
|
152
|
+
"""
|
|
153
|
+
response = self.request(f"/v0/imports/{import_id}", method="DELETE")
|
|
154
|
+
return Import.model_validate(response)
|
|
155
|
+
|
|
156
|
+
def wait_until_completed(self, import_id: str, *, timeout: int = 1800, poll_interval: int = 5) -> Import:
|
|
157
|
+
"""Wait until an import is completed or failed.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
import_id (str): The id of the Import.
|
|
161
|
+
timeout (int, optional): Maximum time to wait in seconds. Defaults to 1800 (30 minutes).
|
|
162
|
+
poll_interval (int, optional): Time to wait between polls in seconds. Defaults to 5.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Import: The import once it's completed or failed.
|
|
166
|
+
|
|
167
|
+
Raises:
|
|
168
|
+
TimeoutError: If the import does not complete within the timeout period.
|
|
169
|
+
"""
|
|
170
|
+
start_time = time.time()
|
|
171
|
+
while True:
|
|
172
|
+
import_obj = self.get(import_id)
|
|
173
|
+
if import_obj.status in ['completed', 'failed']:
|
|
174
|
+
return import_obj
|
|
175
|
+
|
|
176
|
+
if time.time() - start_time > timeout:
|
|
177
|
+
raise TimeoutError(f"Import {import_id} did not complete within {timeout} seconds")
|
|
178
|
+
|
|
179
|
+
time.sleep(poll_interval)
|
|
@@ -93,10 +93,14 @@ class CreateWebhookParameters(ExaBaseModel):
|
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
class CreateWebsetParameters(ExaBaseModel):
|
|
96
|
-
search: CreateWebsetParametersSearch
|
|
96
|
+
search: Optional[CreateWebsetParametersSearch] = None
|
|
97
97
|
"""
|
|
98
98
|
Create initial search for the Webset.
|
|
99
99
|
"""
|
|
100
|
+
imports: Optional[List[ImportItem]] = Field(None, alias='import')
|
|
101
|
+
"""
|
|
102
|
+
Import data from existing Websets and Imports into this Webset.
|
|
103
|
+
"""
|
|
100
104
|
enrichments: Optional[List[CreateEnrichmentParameters]] = None
|
|
101
105
|
"""
|
|
102
106
|
Add Enrichments for the Webset.
|
|
@@ -153,6 +157,10 @@ class CreateWebsetSearchParameters(ExaBaseModel):
|
|
|
153
157
|
|
|
154
158
|
It's not required to provide your own criteria, we automatically detect the criteria from all the information provided in the query.
|
|
155
159
|
"""
|
|
160
|
+
exclude: Optional[List[ExcludeItem]] = None
|
|
161
|
+
"""
|
|
162
|
+
Sources (existing imports or websets) to exclude from search results. Any results found within these sources will be omitted to prevent finding them during search.
|
|
163
|
+
"""
|
|
156
164
|
behavior: Optional[WebsetSearchBehavior] = 'override'
|
|
157
165
|
"""
|
|
158
166
|
The behavior of the Search when it is added to a Webset.
|
|
@@ -219,6 +227,9 @@ class EventType(Enum):
|
|
|
219
227
|
webset_search_canceled = 'webset.search.canceled'
|
|
220
228
|
webset_search_completed = 'webset.search.completed'
|
|
221
229
|
webset_search_updated = 'webset.search.updated'
|
|
230
|
+
import_created = 'import.created'
|
|
231
|
+
import_completed = 'import.completed'
|
|
232
|
+
import_processing = 'import.processing'
|
|
222
233
|
webset_export_created = 'webset.export.created'
|
|
223
234
|
webset_export_completed = 'webset.export.completed'
|
|
224
235
|
webset_item_created = 'webset.item.created'
|
|
@@ -240,6 +251,41 @@ class Format(Enum):
|
|
|
240
251
|
phone = 'phone'
|
|
241
252
|
|
|
242
253
|
|
|
254
|
+
class ImportFormat(Enum):
|
|
255
|
+
"""
|
|
256
|
+
The format of the import.
|
|
257
|
+
"""
|
|
258
|
+
csv = 'csv'
|
|
259
|
+
webset = 'webset'
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class ImportStatus(Enum):
|
|
263
|
+
"""
|
|
264
|
+
The status of the import.
|
|
265
|
+
"""
|
|
266
|
+
pending = 'pending'
|
|
267
|
+
processing = 'processing'
|
|
268
|
+
completed = 'completed'
|
|
269
|
+
failed = 'failed'
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class ImportFailedReason(Enum):
|
|
273
|
+
"""
|
|
274
|
+
The reason the import failed.
|
|
275
|
+
"""
|
|
276
|
+
invalid_format = 'invalid_format'
|
|
277
|
+
invalid_file_content = 'invalid_file_content'
|
|
278
|
+
missing_identifier = 'missing_identifier'
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class ImportSource(Enum):
|
|
282
|
+
"""
|
|
283
|
+
The source type for imports and excludes.
|
|
284
|
+
"""
|
|
285
|
+
import_ = 'import'
|
|
286
|
+
webset = 'webset'
|
|
287
|
+
|
|
288
|
+
|
|
243
289
|
class ListEventsResponse(ExaBaseModel):
|
|
244
290
|
data: List[
|
|
245
291
|
Union[
|
|
@@ -358,6 +404,254 @@ class ListWebsetsResponse(ExaBaseModel):
|
|
|
358
404
|
"""
|
|
359
405
|
|
|
360
406
|
|
|
407
|
+
class ImportItem(ExaBaseModel):
|
|
408
|
+
"""
|
|
409
|
+
Represents a source to import from.
|
|
410
|
+
"""
|
|
411
|
+
source: ImportSource
|
|
412
|
+
"""
|
|
413
|
+
The type of source (import or webset)
|
|
414
|
+
"""
|
|
415
|
+
id: constr(min_length=1)
|
|
416
|
+
"""
|
|
417
|
+
The ID of the source to import from
|
|
418
|
+
"""
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class ExcludeItem(ExaBaseModel):
|
|
422
|
+
"""
|
|
423
|
+
Represents a source to exclude from search results.
|
|
424
|
+
"""
|
|
425
|
+
source: ImportSource
|
|
426
|
+
"""
|
|
427
|
+
The type of source (import or webset)
|
|
428
|
+
"""
|
|
429
|
+
id: constr(min_length=1)
|
|
430
|
+
"""
|
|
431
|
+
The ID of the source to exclude
|
|
432
|
+
"""
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
class CsvImportConfig(ExaBaseModel):
|
|
436
|
+
"""
|
|
437
|
+
Configuration for CSV imports.
|
|
438
|
+
"""
|
|
439
|
+
identifier: Optional[PositiveInt] = None
|
|
440
|
+
"""
|
|
441
|
+
Column index containing the key identifier for the entity (e.g., URL). If not provided, will be inferred.
|
|
442
|
+
"""
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
class CreateImportParameters(ExaBaseModel):
|
|
446
|
+
"""
|
|
447
|
+
Parameters for creating an import.
|
|
448
|
+
"""
|
|
449
|
+
size: Optional[confloat(le=50000000.0)] = None
|
|
450
|
+
"""
|
|
451
|
+
The size of the file in bytes. Maximum size is 50 MB.
|
|
452
|
+
Auto-calculated when csv_data is provided and size is not specified.
|
|
453
|
+
"""
|
|
454
|
+
count: Optional[float] = None
|
|
455
|
+
"""
|
|
456
|
+
The number of records to import
|
|
457
|
+
Auto-calculated when csv_data is provided and count is not specified.
|
|
458
|
+
"""
|
|
459
|
+
title: Optional[str] = None
|
|
460
|
+
"""
|
|
461
|
+
The title of the import
|
|
462
|
+
"""
|
|
463
|
+
format: ImportFormat
|
|
464
|
+
"""
|
|
465
|
+
The format of the import data
|
|
466
|
+
"""
|
|
467
|
+
entity: Union[
|
|
468
|
+
WebsetCompanyEntity,
|
|
469
|
+
WebsetPersonEntity,
|
|
470
|
+
WebsetArticleEntity,
|
|
471
|
+
WebsetResearchPaperEntity,
|
|
472
|
+
WebsetCustomEntity,
|
|
473
|
+
]
|
|
474
|
+
"""
|
|
475
|
+
The type of entity the import contains
|
|
476
|
+
"""
|
|
477
|
+
csv: Optional[CsvImportConfig] = None
|
|
478
|
+
"""
|
|
479
|
+
CSV-specific configuration when format is 'csv'
|
|
480
|
+
"""
|
|
481
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
482
|
+
"""
|
|
483
|
+
Set of key-value pairs you want to associate with this object.
|
|
484
|
+
"""
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
class CreateImportResponse(ExaBaseModel):
|
|
488
|
+
"""
|
|
489
|
+
Response from creating an import.
|
|
490
|
+
"""
|
|
491
|
+
id: str
|
|
492
|
+
"""
|
|
493
|
+
The unique identifier for the Import
|
|
494
|
+
"""
|
|
495
|
+
object: Literal['import']
|
|
496
|
+
"""
|
|
497
|
+
The type of object
|
|
498
|
+
"""
|
|
499
|
+
status: ImportStatus
|
|
500
|
+
"""
|
|
501
|
+
The status of the Import
|
|
502
|
+
"""
|
|
503
|
+
format: ImportFormat
|
|
504
|
+
"""
|
|
505
|
+
The format of the import
|
|
506
|
+
"""
|
|
507
|
+
entity: Optional[Union[
|
|
508
|
+
WebsetCompanyEntity,
|
|
509
|
+
WebsetPersonEntity,
|
|
510
|
+
WebsetArticleEntity,
|
|
511
|
+
WebsetResearchPaperEntity,
|
|
512
|
+
WebsetCustomEntity,
|
|
513
|
+
]] = None
|
|
514
|
+
"""
|
|
515
|
+
The type of entity the import contains
|
|
516
|
+
"""
|
|
517
|
+
title: str
|
|
518
|
+
"""
|
|
519
|
+
The title of the import
|
|
520
|
+
"""
|
|
521
|
+
count: float
|
|
522
|
+
"""
|
|
523
|
+
The number of entities in the import
|
|
524
|
+
"""
|
|
525
|
+
metadata: Dict[str, Any]
|
|
526
|
+
"""
|
|
527
|
+
Set of key-value pairs associated with this object
|
|
528
|
+
"""
|
|
529
|
+
failed_reason: Optional[ImportFailedReason] = Field(None, alias='failedReason')
|
|
530
|
+
"""
|
|
531
|
+
The reason the import failed, if applicable
|
|
532
|
+
"""
|
|
533
|
+
failed_at: Optional[datetime] = Field(None, alias='failedAt')
|
|
534
|
+
"""
|
|
535
|
+
When the import failed, if applicable
|
|
536
|
+
"""
|
|
537
|
+
failed_message: Optional[str] = Field(None, alias='failedMessage')
|
|
538
|
+
"""
|
|
539
|
+
A human readable message describing the import failure
|
|
540
|
+
"""
|
|
541
|
+
created_at: datetime = Field(..., alias='createdAt')
|
|
542
|
+
"""
|
|
543
|
+
When the import was created
|
|
544
|
+
"""
|
|
545
|
+
updated_at: datetime = Field(..., alias='updatedAt')
|
|
546
|
+
"""
|
|
547
|
+
When the import was last updated
|
|
548
|
+
"""
|
|
549
|
+
upload_url: str = Field(..., alias='uploadUrl')
|
|
550
|
+
"""
|
|
551
|
+
The URL to upload the file to
|
|
552
|
+
"""
|
|
553
|
+
upload_valid_until: str = Field(..., alias='uploadValidUntil')
|
|
554
|
+
"""
|
|
555
|
+
The date and time until the upload URL is valid
|
|
556
|
+
"""
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
class Import(ExaBaseModel):
|
|
560
|
+
"""
|
|
561
|
+
Represents an import.
|
|
562
|
+
"""
|
|
563
|
+
id: str
|
|
564
|
+
"""
|
|
565
|
+
The unique identifier for the Import
|
|
566
|
+
"""
|
|
567
|
+
object: Literal['import']
|
|
568
|
+
"""
|
|
569
|
+
The type of object
|
|
570
|
+
"""
|
|
571
|
+
status: ImportStatus
|
|
572
|
+
"""
|
|
573
|
+
The status of the Import
|
|
574
|
+
"""
|
|
575
|
+
format: ImportFormat
|
|
576
|
+
"""
|
|
577
|
+
The format of the import
|
|
578
|
+
"""
|
|
579
|
+
entity: Optional[Union[
|
|
580
|
+
WebsetCompanyEntity,
|
|
581
|
+
WebsetPersonEntity,
|
|
582
|
+
WebsetArticleEntity,
|
|
583
|
+
WebsetResearchPaperEntity,
|
|
584
|
+
WebsetCustomEntity,
|
|
585
|
+
]] = None
|
|
586
|
+
"""
|
|
587
|
+
The type of entity the import contains
|
|
588
|
+
"""
|
|
589
|
+
title: str
|
|
590
|
+
"""
|
|
591
|
+
The title of the import
|
|
592
|
+
"""
|
|
593
|
+
count: float
|
|
594
|
+
"""
|
|
595
|
+
The number of entities in the import
|
|
596
|
+
"""
|
|
597
|
+
metadata: Dict[str, Any]
|
|
598
|
+
"""
|
|
599
|
+
Set of key-value pairs associated with this object
|
|
600
|
+
"""
|
|
601
|
+
failed_reason: Optional[ImportFailedReason] = Field(None, alias='failedReason')
|
|
602
|
+
"""
|
|
603
|
+
The reason the import failed, if applicable
|
|
604
|
+
"""
|
|
605
|
+
failed_at: Optional[datetime] = Field(None, alias='failedAt')
|
|
606
|
+
"""
|
|
607
|
+
When the import failed, if applicable
|
|
608
|
+
"""
|
|
609
|
+
failed_message: Optional[str] = Field(None, alias='failedMessage')
|
|
610
|
+
"""
|
|
611
|
+
A human readable message describing the import failure
|
|
612
|
+
"""
|
|
613
|
+
created_at: datetime = Field(..., alias='createdAt')
|
|
614
|
+
"""
|
|
615
|
+
When the import was created
|
|
616
|
+
"""
|
|
617
|
+
updated_at: datetime = Field(..., alias='updatedAt')
|
|
618
|
+
"""
|
|
619
|
+
When the import was last updated
|
|
620
|
+
"""
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
class ListImportsResponse(ExaBaseModel):
|
|
624
|
+
"""
|
|
625
|
+
Response from listing imports.
|
|
626
|
+
"""
|
|
627
|
+
data: List[Import]
|
|
628
|
+
"""
|
|
629
|
+
The list of imports
|
|
630
|
+
"""
|
|
631
|
+
has_more: bool = Field(..., alias='hasMore')
|
|
632
|
+
"""
|
|
633
|
+
Whether there are more results to paginate through
|
|
634
|
+
"""
|
|
635
|
+
next_cursor: Optional[str] = Field(None, alias='nextCursor')
|
|
636
|
+
"""
|
|
637
|
+
The cursor to use for the next page of results
|
|
638
|
+
"""
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
class UpdateImport(ExaBaseModel):
|
|
642
|
+
"""
|
|
643
|
+
Parameters for updating an import.
|
|
644
|
+
"""
|
|
645
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
646
|
+
"""
|
|
647
|
+
Set of key-value pairs you want to associate with this object.
|
|
648
|
+
"""
|
|
649
|
+
title: Optional[str] = None
|
|
650
|
+
"""
|
|
651
|
+
The title of the import
|
|
652
|
+
"""
|
|
653
|
+
|
|
654
|
+
|
|
361
655
|
class Option(ExaBaseModel):
|
|
362
656
|
label: str
|
|
363
657
|
"""
|
|
@@ -451,6 +745,10 @@ class CreateWebsetParametersSearch(ExaBaseModel):
|
|
|
451
745
|
|
|
452
746
|
It's not required to provide your own criteria, we automatically detect the criteria from all the information provided in the query.
|
|
453
747
|
"""
|
|
748
|
+
exclude: Optional[List[ExcludeItem]] = None
|
|
749
|
+
"""
|
|
750
|
+
Sources (existing imports or websets) to exclude from search results. Any results found within these sources will be omitted to prevent finding them during search.
|
|
751
|
+
"""
|
|
454
752
|
|
|
455
753
|
|
|
456
754
|
class Source(Enum):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|