parallel-web 0.2.2__tar.gz → 0.3.0__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 parallel-web might be problematic. Click here for more details.

Files changed (139) hide show
  1. parallel_web-0.3.0/.release-please-manifest.json +3 -0
  2. {parallel_web-0.2.2 → parallel_web-0.3.0}/CHANGELOG.md +13 -0
  3. {parallel_web-0.2.2 → parallel_web-0.3.0}/PKG-INFO +2 -2
  4. {parallel_web-0.2.2 → parallel_web-0.3.0}/api.md +9 -1
  5. {parallel_web-0.2.2 → parallel_web-0.3.0}/pyproject.toml +2 -2
  6. {parallel_web-0.2.2 → parallel_web-0.3.0}/requirements-dev.lock +1 -1
  7. {parallel_web-0.2.2 → parallel_web-0.3.0}/requirements.lock +1 -1
  8. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_version.py +1 -1
  9. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/beta/beta.py +179 -5
  10. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/__init__.py +5 -0
  11. parallel_web-0.3.0/src/parallel/types/beta/beta_extract_params.py +85 -0
  12. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/beta_search_params.py +8 -3
  13. parallel_web-0.3.0/src/parallel/types/beta/excerpt_settings_param.py +17 -0
  14. parallel_web-0.3.0/src/parallel/types/beta/extract_error.py +20 -0
  15. parallel_web-0.3.0/src/parallel/types/beta/extract_response.py +20 -0
  16. parallel_web-0.3.0/src/parallel/types/beta/extract_result.py +23 -0
  17. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/api_resources/beta/test_task_group.py +4 -4
  18. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/api_resources/beta/test_task_run.py +4 -4
  19. parallel_web-0.3.0/tests/api_resources/test_beta.py +202 -0
  20. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/api_resources/test_task_run.py +4 -4
  21. parallel_web-0.2.2/.release-please-manifest.json +0 -3
  22. parallel_web-0.2.2/tests/api_resources/test_beta.py +0 -104
  23. {parallel_web-0.2.2 → parallel_web-0.3.0}/.gitignore +0 -0
  24. {parallel_web-0.2.2 → parallel_web-0.3.0}/CONTRIBUTING.md +0 -0
  25. {parallel_web-0.2.2 → parallel_web-0.3.0}/LICENSE +0 -0
  26. {parallel_web-0.2.2 → parallel_web-0.3.0}/README.md +0 -0
  27. {parallel_web-0.2.2 → parallel_web-0.3.0}/SECURITY.md +0 -0
  28. {parallel_web-0.2.2 → parallel_web-0.3.0}/bin/check-release-environment +0 -0
  29. {parallel_web-0.2.2 → parallel_web-0.3.0}/bin/publish-pypi +0 -0
  30. {parallel_web-0.2.2 → parallel_web-0.3.0}/examples/.keep +0 -0
  31. {parallel_web-0.2.2 → parallel_web-0.3.0}/noxfile.py +0 -0
  32. {parallel_web-0.2.2 → parallel_web-0.3.0}/release-please-config.json +0 -0
  33. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/__init__.py +0 -0
  34. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_base_client.py +0 -0
  35. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_client.py +0 -0
  36. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_compat.py +0 -0
  37. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_constants.py +0 -0
  38. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_exceptions.py +0 -0
  39. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_files.py +0 -0
  40. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_models.py +0 -0
  41. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_qs.py +0 -0
  42. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_resource.py +0 -0
  43. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_response.py +0 -0
  44. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_streaming.py +0 -0
  45. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_types.py +0 -0
  46. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/__init__.py +0 -0
  47. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_compat.py +0 -0
  48. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_datetime_parse.py +0 -0
  49. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_logs.py +0 -0
  50. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_proxy.py +0 -0
  51. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_reflection.py +0 -0
  52. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_resources_proxy.py +0 -0
  53. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_streams.py +0 -0
  54. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_sync.py +0 -0
  55. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_transform.py +0 -0
  56. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_typing.py +0 -0
  57. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/_utils/_utils.py +0 -0
  58. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/.keep +0 -0
  59. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/__init__.py +0 -0
  60. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/_parsing/__init__.py +0 -0
  61. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/_parsing/_task_run_result.py +0 -0
  62. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/_parsing/_task_spec.py +0 -0
  63. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/_pydantic.py +0 -0
  64. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/lib/_time.py +0 -0
  65. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/py.typed +0 -0
  66. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/__init__.py +0 -0
  67. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/beta/__init__.py +0 -0
  68. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/beta/task_group.py +0 -0
  69. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/beta/task_run.py +0 -0
  70. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/resources/task_run.py +0 -0
  71. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/__init__.py +0 -0
  72. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/auto_schema.py +0 -0
  73. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/auto_schema_param.py +0 -0
  74. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/beta_run_input.py +0 -0
  75. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/beta_run_input_param.py +0 -0
  76. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/beta_task_run_result.py +0 -0
  77. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/error_event.py +0 -0
  78. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/mcp_server.py +0 -0
  79. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/mcp_server_param.py +0 -0
  80. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/mcp_tool_call.py +0 -0
  81. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/parallel_beta_param.py +0 -0
  82. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/search_result.py +0 -0
  83. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group.py +0 -0
  84. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_add_runs_params.py +0 -0
  85. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_create_params.py +0 -0
  86. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_events_params.py +0 -0
  87. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_events_response.py +0 -0
  88. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_get_runs_params.py +0 -0
  89. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_get_runs_response.py +0 -0
  90. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_run_response.py +0 -0
  91. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_group_status.py +0 -0
  92. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_run_create_params.py +0 -0
  93. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_run_event.py +0 -0
  94. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_run_events_response.py +0 -0
  95. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/task_run_result_params.py +0 -0
  96. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/web_search_result.py +0 -0
  97. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/webhook.py +0 -0
  98. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/beta/webhook_param.py +0 -0
  99. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/citation.py +0 -0
  100. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/field_basis.py +0 -0
  101. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/json_schema.py +0 -0
  102. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/json_schema_param.py +0 -0
  103. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/parsed_task_run_result.py +0 -0
  104. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared/__init__.py +0 -0
  105. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared/error_object.py +0 -0
  106. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared/error_response.py +0 -0
  107. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared/source_policy.py +0 -0
  108. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared/warning.py +0 -0
  109. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared_params/__init__.py +0 -0
  110. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/shared_params/source_policy.py +0 -0
  111. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run.py +0 -0
  112. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run_create_params.py +0 -0
  113. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run_json_output.py +0 -0
  114. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run_result.py +0 -0
  115. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run_result_params.py +0 -0
  116. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_run_text_output.py +0 -0
  117. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_spec.py +0 -0
  118. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/task_spec_param.py +0 -0
  119. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/text_schema.py +0 -0
  120. {parallel_web-0.2.2 → parallel_web-0.3.0}/src/parallel/types/text_schema_param.py +0 -0
  121. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/__init__.py +0 -0
  122. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/api_resources/__init__.py +0 -0
  123. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/api_resources/beta/__init__.py +0 -0
  124. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/conftest.py +0 -0
  125. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/sample_file.txt +0 -0
  126. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_client.py +0 -0
  127. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_deepcopy.py +0 -0
  128. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_extract_files.py +0 -0
  129. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_files.py +0 -0
  130. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_models.py +0 -0
  131. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_qs.py +0 -0
  132. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_required_args.py +0 -0
  133. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_response.py +0 -0
  134. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_streaming.py +0 -0
  135. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_transform.py +0 -0
  136. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_utils/test_datetime_parse.py +0 -0
  137. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_utils/test_proxy.py +0 -0
  138. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/test_utils/test_typing.py +0 -0
  139. {parallel_web-0.2.2 → parallel_web-0.3.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.0"
3
+ }
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2025-10-21)
4
+
5
+ Full Changelog: [v0.2.2...v0.3.0](https://github.com/parallel-web/parallel-sdk-python/compare/v0.2.2...v0.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** Add /v1beta/extract ([df40ff5](https://github.com/parallel-web/parallel-sdk-python/commit/df40ff551e5a5e91576066de4c8216e3bd7e1bb1))
10
+
11
+
12
+ ### Chores
13
+
14
+ * bump `httpx-aiohttp` version to 0.1.9 ([4da4812](https://github.com/parallel-web/parallel-sdk-python/commit/4da4812c00f76d6613eb14b388b84171ceee074d))
15
+
3
16
  ## 0.2.2 (2025-10-16)
4
17
 
5
18
  Full Changelog: [v0.2.1...v0.2.2](https://github.com/parallel-web/parallel-sdk-python/compare/v0.2.1...v0.2.2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: parallel-web
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: The official Python library for the Parallel API
5
5
  Project-URL: Homepage, https://github.com/parallel-web/parallel-sdk-python
6
6
  Project-URL: Repository, https://github.com/parallel-web/parallel-sdk-python
@@ -30,7 +30,7 @@ Requires-Dist: sniffio
30
30
  Requires-Dist: typing-extensions<5,>=4.10
31
31
  Provides-Extra: aiohttp
32
32
  Requires-Dist: aiohttp; extra == 'aiohttp'
33
- Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
33
+ Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
34
34
  Description-Content-Type: text/markdown
35
35
 
36
36
  # Parallel Python API library
@@ -40,11 +40,19 @@ Convenience methods:
40
40
  Types:
41
41
 
42
42
  ```python
43
- from parallel.types.beta import SearchResult, WebSearchResult
43
+ from parallel.types.beta import (
44
+ ExcerptSettings,
45
+ ExtractError,
46
+ ExtractResponse,
47
+ ExtractResult,
48
+ SearchResult,
49
+ WebSearchResult,
50
+ )
44
51
  ```
45
52
 
46
53
  Methods:
47
54
 
55
+ - <code title="post /v1beta/extract">client.beta.<a href="./src/parallel/resources/beta/beta.py">extract</a>(\*\*<a href="src/parallel/types/beta/beta_extract_params.py">params</a>) -> <a href="./src/parallel/types/beta/extract_response.py">ExtractResponse</a></code>
48
56
  - <code title="post /v1beta/search">client.beta.<a href="./src/parallel/resources/beta/beta.py">search</a>(\*\*<a href="src/parallel/types/beta/beta_search_params.py">params</a>) -> <a href="./src/parallel/types/beta/search_result.py">SearchResult</a></code>
49
57
 
50
58
  ## TaskRun
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "parallel-web"
3
- version = "0.2.2"
3
+ version = "0.3.0"
4
4
  description = "The official Python library for the Parallel API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -39,7 +39,7 @@ Homepage = "https://github.com/parallel-web/parallel-sdk-python"
39
39
  Repository = "https://github.com/parallel-web/parallel-sdk-python"
40
40
 
41
41
  [project.optional-dependencies]
42
- aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
42
+ aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
43
43
 
44
44
  [tool.rye]
45
45
  managed = true
@@ -59,7 +59,7 @@ httpx==0.28.1
59
59
  # via httpx-aiohttp
60
60
  # via parallel-web
61
61
  # via respx
62
- httpx-aiohttp==0.1.8
62
+ httpx-aiohttp==0.1.9
63
63
  # via parallel-web
64
64
  idna==3.4
65
65
  # via anyio
@@ -43,7 +43,7 @@ httpcore==1.0.9
43
43
  httpx==0.28.1
44
44
  # via httpx-aiohttp
45
45
  # via parallel-web
46
- httpx-aiohttp==0.1.8
46
+ httpx-aiohttp==0.1.9
47
47
  # via parallel-web
48
48
  idna==3.4
49
49
  # via anyio
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "parallel"
4
- __version__ = "0.2.2" # x-release-please-version
4
+ __version__ = "0.3.0" # x-release-please-version
@@ -2,13 +2,13 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Optional
5
+ from typing import List, Optional
6
6
  from typing_extensions import Literal
7
7
 
8
8
  import httpx
9
9
 
10
10
  from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
11
- from ..._utils import maybe_transform, async_maybe_transform
11
+ from ..._utils import is_given, maybe_transform, strip_not_given, async_maybe_transform
12
12
  from .task_run import (
13
13
  TaskRunResource,
14
14
  AsyncTaskRunResource,
@@ -33,9 +33,11 @@ from ..._response import (
33
33
  async_to_raw_response_wrapper,
34
34
  async_to_streamed_response_wrapper,
35
35
  )
36
- from ...types.beta import beta_search_params
36
+ from ...types.beta import beta_search_params, beta_extract_params
37
37
  from ..._base_client import make_request_options
38
38
  from ...types.beta.search_result import SearchResult
39
+ from ...types.beta.extract_response import ExtractResponse
40
+ from ...types.beta.parallel_beta_param import ParallelBetaParam
39
41
  from ...types.shared_params.source_policy import SourcePolicy
40
42
 
41
43
  __all__ = ["BetaResource", "AsyncBetaResource"]
@@ -69,15 +71,89 @@ class BetaResource(SyncAPIResource):
69
71
  """
70
72
  return BetaResourceWithStreamingResponse(self)
71
73
 
74
+ def extract(
75
+ self,
76
+ *,
77
+ urls: SequenceNotStr[str],
78
+ excerpts: beta_extract_params.Excerpts | Omit = omit,
79
+ fetch_policy: Optional[beta_extract_params.FetchPolicy] | Omit = omit,
80
+ full_content: beta_extract_params.FullContent | Omit = omit,
81
+ objective: Optional[str] | Omit = omit,
82
+ search_queries: Optional[SequenceNotStr[str]] | Omit = omit,
83
+ betas: List[ParallelBetaParam] | Omit = omit,
84
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
85
+ # The extra values given here take precedence over values defined on the client or passed to this method.
86
+ extra_headers: Headers | None = None,
87
+ extra_query: Query | None = None,
88
+ extra_body: Body | None = None,
89
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
90
+ ) -> ExtractResponse:
91
+ """
92
+ Extracts relevant content from specific web URLs.
93
+
94
+ To access this endpoint, pass the `parallel-beta` header with the value
95
+ `search-extract-2025-10-10`.
96
+
97
+ Args:
98
+ excerpts: Include excerpts from each URL relevant to the search objective and queries.
99
+ Note that if neither objective nor search_queries is provided, excerpts are
100
+ redundant with full content.
101
+
102
+ fetch_policy: Fetch policy.
103
+
104
+ Determines when to return content from the cache (faster) vs fetching live
105
+ content (fresher).
106
+
107
+ full_content: Include full content from each URL. Note that if neither objective nor
108
+ search_queries is provided, excerpts are redundant with full content.
109
+
110
+ objective: If provided, focuses extracted content on the specified search objective.
111
+
112
+ search_queries: If provided, focuses extracted content on the specified keyword search queries.
113
+
114
+ betas: Optional header to specify the beta version(s) to enable.
115
+
116
+ extra_headers: Send extra headers
117
+
118
+ extra_query: Add additional query parameters to the request
119
+
120
+ extra_body: Add additional JSON properties to the request
121
+
122
+ timeout: Override the client-level default timeout for this request, in seconds
123
+ """
124
+ extra_headers = {
125
+ **strip_not_given({"parallel-beta": ",".join(str(e) for e in betas) if is_given(betas) else not_given}),
126
+ **(extra_headers or {}),
127
+ }
128
+ return self._post(
129
+ "/v1beta/extract",
130
+ body=maybe_transform(
131
+ {
132
+ "urls": urls,
133
+ "excerpts": excerpts,
134
+ "fetch_policy": fetch_policy,
135
+ "full_content": full_content,
136
+ "objective": objective,
137
+ "search_queries": search_queries,
138
+ },
139
+ beta_extract_params.BetaExtractParams,
140
+ ),
141
+ options=make_request_options(
142
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
143
+ ),
144
+ cast_to=ExtractResponse,
145
+ )
146
+
72
147
  def search(
73
148
  self,
74
149
  *,
75
150
  max_chars_per_result: Optional[int] | Omit = omit,
76
151
  max_results: Optional[int] | Omit = omit,
77
152
  objective: Optional[str] | Omit = omit,
78
- processor: Literal["base", "pro"] | Omit = omit,
153
+ processor: Optional[Literal["base", "pro"]] | Omit = omit,
79
154
  search_queries: Optional[SequenceNotStr[str]] | Omit = omit,
80
155
  source_policy: Optional[SourcePolicy] | Omit = omit,
156
+ betas: List[ParallelBetaParam] | Omit = omit,
81
157
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
82
158
  # The extra values given here take precedence over values defined on the client or passed to this method.
83
159
  extra_headers: Headers | None = None,
@@ -109,6 +185,8 @@ class BetaResource(SyncAPIResource):
109
185
 
110
186
  This policy governs which sources are allowed/disallowed in results.
111
187
 
188
+ betas: Optional header to specify the beta version(s) to enable.
189
+
112
190
  extra_headers: Send extra headers
113
191
 
114
192
  extra_query: Add additional query parameters to the request
@@ -117,6 +195,10 @@ class BetaResource(SyncAPIResource):
117
195
 
118
196
  timeout: Override the client-level default timeout for this request, in seconds
119
197
  """
198
+ extra_headers = {
199
+ **strip_not_given({"parallel-beta": ",".join(str(e) for e in betas) if is_given(betas) else not_given}),
200
+ **(extra_headers or {}),
201
+ }
120
202
  return self._post(
121
203
  "/v1beta/search",
122
204
  body=maybe_transform(
@@ -165,15 +247,89 @@ class AsyncBetaResource(AsyncAPIResource):
165
247
  """
166
248
  return AsyncBetaResourceWithStreamingResponse(self)
167
249
 
250
+ async def extract(
251
+ self,
252
+ *,
253
+ urls: SequenceNotStr[str],
254
+ excerpts: beta_extract_params.Excerpts | Omit = omit,
255
+ fetch_policy: Optional[beta_extract_params.FetchPolicy] | Omit = omit,
256
+ full_content: beta_extract_params.FullContent | Omit = omit,
257
+ objective: Optional[str] | Omit = omit,
258
+ search_queries: Optional[SequenceNotStr[str]] | Omit = omit,
259
+ betas: List[ParallelBetaParam] | Omit = omit,
260
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
261
+ # The extra values given here take precedence over values defined on the client or passed to this method.
262
+ extra_headers: Headers | None = None,
263
+ extra_query: Query | None = None,
264
+ extra_body: Body | None = None,
265
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
266
+ ) -> ExtractResponse:
267
+ """
268
+ Extracts relevant content from specific web URLs.
269
+
270
+ To access this endpoint, pass the `parallel-beta` header with the value
271
+ `search-extract-2025-10-10`.
272
+
273
+ Args:
274
+ excerpts: Include excerpts from each URL relevant to the search objective and queries.
275
+ Note that if neither objective nor search_queries is provided, excerpts are
276
+ redundant with full content.
277
+
278
+ fetch_policy: Fetch policy.
279
+
280
+ Determines when to return content from the cache (faster) vs fetching live
281
+ content (fresher).
282
+
283
+ full_content: Include full content from each URL. Note that if neither objective nor
284
+ search_queries is provided, excerpts are redundant with full content.
285
+
286
+ objective: If provided, focuses extracted content on the specified search objective.
287
+
288
+ search_queries: If provided, focuses extracted content on the specified keyword search queries.
289
+
290
+ betas: Optional header to specify the beta version(s) to enable.
291
+
292
+ extra_headers: Send extra headers
293
+
294
+ extra_query: Add additional query parameters to the request
295
+
296
+ extra_body: Add additional JSON properties to the request
297
+
298
+ timeout: Override the client-level default timeout for this request, in seconds
299
+ """
300
+ extra_headers = {
301
+ **strip_not_given({"parallel-beta": ",".join(str(e) for e in betas) if is_given(betas) else not_given}),
302
+ **(extra_headers or {}),
303
+ }
304
+ return await self._post(
305
+ "/v1beta/extract",
306
+ body=await async_maybe_transform(
307
+ {
308
+ "urls": urls,
309
+ "excerpts": excerpts,
310
+ "fetch_policy": fetch_policy,
311
+ "full_content": full_content,
312
+ "objective": objective,
313
+ "search_queries": search_queries,
314
+ },
315
+ beta_extract_params.BetaExtractParams,
316
+ ),
317
+ options=make_request_options(
318
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
319
+ ),
320
+ cast_to=ExtractResponse,
321
+ )
322
+
168
323
  async def search(
169
324
  self,
170
325
  *,
171
326
  max_chars_per_result: Optional[int] | Omit = omit,
172
327
  max_results: Optional[int] | Omit = omit,
173
328
  objective: Optional[str] | Omit = omit,
174
- processor: Literal["base", "pro"] | Omit = omit,
329
+ processor: Optional[Literal["base", "pro"]] | Omit = omit,
175
330
  search_queries: Optional[SequenceNotStr[str]] | Omit = omit,
176
331
  source_policy: Optional[SourcePolicy] | Omit = omit,
332
+ betas: List[ParallelBetaParam] | Omit = omit,
177
333
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
178
334
  # The extra values given here take precedence over values defined on the client or passed to this method.
179
335
  extra_headers: Headers | None = None,
@@ -205,6 +361,8 @@ class AsyncBetaResource(AsyncAPIResource):
205
361
 
206
362
  This policy governs which sources are allowed/disallowed in results.
207
363
 
364
+ betas: Optional header to specify the beta version(s) to enable.
365
+
208
366
  extra_headers: Send extra headers
209
367
 
210
368
  extra_query: Add additional query parameters to the request
@@ -213,6 +371,10 @@ class AsyncBetaResource(AsyncAPIResource):
213
371
 
214
372
  timeout: Override the client-level default timeout for this request, in seconds
215
373
  """
374
+ extra_headers = {
375
+ **strip_not_given({"parallel-beta": ",".join(str(e) for e in betas) if is_given(betas) else not_given}),
376
+ **(extra_headers or {}),
377
+ }
216
378
  return await self._post(
217
379
  "/v1beta/search",
218
380
  body=await async_maybe_transform(
@@ -237,6 +399,9 @@ class BetaResourceWithRawResponse:
237
399
  def __init__(self, beta: BetaResource) -> None:
238
400
  self._beta = beta
239
401
 
402
+ self.extract = to_raw_response_wrapper(
403
+ beta.extract,
404
+ )
240
405
  self.search = to_raw_response_wrapper(
241
406
  beta.search,
242
407
  )
@@ -254,6 +419,9 @@ class AsyncBetaResourceWithRawResponse:
254
419
  def __init__(self, beta: AsyncBetaResource) -> None:
255
420
  self._beta = beta
256
421
 
422
+ self.extract = async_to_raw_response_wrapper(
423
+ beta.extract,
424
+ )
257
425
  self.search = async_to_raw_response_wrapper(
258
426
  beta.search,
259
427
  )
@@ -271,6 +439,9 @@ class BetaResourceWithStreamingResponse:
271
439
  def __init__(self, beta: BetaResource) -> None:
272
440
  self._beta = beta
273
441
 
442
+ self.extract = to_streamed_response_wrapper(
443
+ beta.extract,
444
+ )
274
445
  self.search = to_streamed_response_wrapper(
275
446
  beta.search,
276
447
  )
@@ -288,6 +459,9 @@ class AsyncBetaResourceWithStreamingResponse:
288
459
  def __init__(self, beta: AsyncBetaResource) -> None:
289
460
  self._beta = beta
290
461
 
462
+ self.extract = async_to_streamed_response_wrapper(
463
+ beta.extract,
464
+ )
291
465
  self.search = async_to_streamed_response_wrapper(
292
466
  beta.search,
293
467
  )
@@ -6,18 +6,23 @@ from .webhook import Webhook as Webhook
6
6
  from .mcp_server import McpServer as McpServer
7
7
  from .task_group import TaskGroup as TaskGroup
8
8
  from .error_event import ErrorEvent as ErrorEvent
9
+ from .extract_error import ExtractError as ExtractError
9
10
  from .mcp_tool_call import McpToolCall as McpToolCall
10
11
  from .search_result import SearchResult as SearchResult
11
12
  from .webhook_param import WebhookParam as WebhookParam
12
13
  from .beta_run_input import BetaRunInput as BetaRunInput
14
+ from .extract_result import ExtractResult as ExtractResult
13
15
  from .task_run_event import TaskRunEvent as TaskRunEvent
16
+ from .extract_response import ExtractResponse as ExtractResponse
14
17
  from .mcp_server_param import McpServerParam as McpServerParam
15
18
  from .task_group_status import TaskGroupStatus as TaskGroupStatus
16
19
  from .web_search_result import WebSearchResult as WebSearchResult
17
20
  from .beta_search_params import BetaSearchParams as BetaSearchParams
21
+ from .beta_extract_params import BetaExtractParams as BetaExtractParams
18
22
  from .parallel_beta_param import ParallelBetaParam as ParallelBetaParam
19
23
  from .beta_run_input_param import BetaRunInputParam as BetaRunInputParam
20
24
  from .beta_task_run_result import BetaTaskRunResult as BetaTaskRunResult
25
+ from .excerpt_settings_param import ExcerptSettingsParam as ExcerptSettingsParam
21
26
  from .task_run_create_params import TaskRunCreateParams as TaskRunCreateParams
22
27
  from .task_run_result_params import TaskRunResultParams as TaskRunResultParams
23
28
  from .task_group_run_response import TaskGroupRunResponse as TaskGroupRunResponse
@@ -0,0 +1,85 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import List, Union, Optional
6
+ from typing_extensions import Required, Annotated, TypeAlias, TypedDict
7
+
8
+ from ..._types import SequenceNotStr
9
+ from ..._utils import PropertyInfo
10
+ from .parallel_beta_param import ParallelBetaParam
11
+ from .excerpt_settings_param import ExcerptSettingsParam
12
+
13
+ __all__ = ["BetaExtractParams", "Excerpts", "FetchPolicy", "FullContent", "FullContentFullContentSettings"]
14
+
15
+
16
+ class BetaExtractParams(TypedDict, total=False):
17
+ urls: Required[SequenceNotStr[str]]
18
+
19
+ excerpts: Excerpts
20
+ """Include excerpts from each URL relevant to the search objective and queries.
21
+
22
+ Note that if neither objective nor search_queries is provided, excerpts are
23
+ redundant with full content.
24
+ """
25
+
26
+ fetch_policy: Optional[FetchPolicy]
27
+ """Fetch policy.
28
+
29
+ Determines when to return content from the cache (faster) vs fetching live
30
+ content (fresher).
31
+ """
32
+
33
+ full_content: FullContent
34
+ """Include full content from each URL.
35
+
36
+ Note that if neither objective nor search_queries is provided, excerpts are
37
+ redundant with full content.
38
+ """
39
+
40
+ objective: Optional[str]
41
+ """If provided, focuses extracted content on the specified search objective."""
42
+
43
+ search_queries: Optional[SequenceNotStr[str]]
44
+ """If provided, focuses extracted content on the specified keyword search queries."""
45
+
46
+ betas: Annotated[List[ParallelBetaParam], PropertyInfo(alias="parallel-beta")]
47
+ """Optional header to specify the beta version(s) to enable."""
48
+
49
+
50
+ Excerpts: TypeAlias = Union[bool, ExcerptSettingsParam]
51
+
52
+
53
+ class FetchPolicy(TypedDict, total=False):
54
+ disable_cache_fallback: bool
55
+ """
56
+ If false, fallback to cached content older than max-age if live fetch fails or
57
+ times out. If true, returns an error instead.
58
+ """
59
+
60
+ max_age_seconds: Optional[int]
61
+ """Maximum age of cached content in seconds to trigger a live fetch.
62
+
63
+ Minimum value 600 seconds (10 minutes). If not provided, a dynamic age policy
64
+ will be used based on the search objective and url.
65
+ """
66
+
67
+ timeout_seconds: Optional[float]
68
+ """Timeout in seconds for fetching live content if unavailable in cache.
69
+
70
+ If unspecified a dynamic timeout will be used based on the url, generally 15
71
+ seconds for simple pages and up to 60 seconds for complex pages requiring
72
+ javascript or PDF rendering.
73
+ """
74
+
75
+
76
+ class FullContentFullContentSettings(TypedDict, total=False):
77
+ max_chars_per_result: Optional[int]
78
+ """
79
+ Optional limit on the number of characters to include in the full content for
80
+ each url. Full content always starts at the beginning of the page and is
81
+ truncated at the limit if necessary.
82
+ """
83
+
84
+
85
+ FullContent: TypeAlias = Union[bool, FullContentFullContentSettings]
@@ -2,10 +2,12 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Optional
6
- from typing_extensions import Literal, TypedDict
5
+ from typing import List, Optional
6
+ from typing_extensions import Literal, Annotated, TypedDict
7
7
 
8
8
  from ..._types import SequenceNotStr
9
+ from ..._utils import PropertyInfo
10
+ from .parallel_beta_param import ParallelBetaParam
9
11
  from ..shared_params.source_policy import SourcePolicy
10
12
 
11
13
  __all__ = ["BetaSearchParams"]
@@ -31,7 +33,7 @@ class BetaSearchParams(TypedDict, total=False):
31
33
  objective or search_queries must be provided.
32
34
  """
33
35
 
34
- processor: Literal["base", "pro"]
36
+ processor: Optional[Literal["base", "pro"]]
35
37
  """Search processor."""
36
38
 
37
39
  search_queries: Optional[SequenceNotStr[str]]
@@ -46,3 +48,6 @@ class BetaSearchParams(TypedDict, total=False):
46
48
 
47
49
  This policy governs which sources are allowed/disallowed in results.
48
50
  """
51
+
52
+ betas: Annotated[List[ParallelBetaParam], PropertyInfo(alias="parallel-beta")]
53
+ """Optional header to specify the beta version(s) to enable."""
@@ -0,0 +1,17 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import TypedDict
7
+
8
+ __all__ = ["ExcerptSettingsParam"]
9
+
10
+
11
+ class ExcerptSettingsParam(TypedDict, total=False):
12
+ max_chars_per_result: Optional[int]
13
+ """
14
+ Optional upper bound on the total number of characters to include across all
15
+ excerpts for each url. Excerpts may contain fewer characters than this limit to
16
+ maximize relevance and token efficiency.
17
+ """
@@ -0,0 +1,20 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+
5
+ from ..._models import BaseModel
6
+
7
+ __all__ = ["ExtractError"]
8
+
9
+
10
+ class ExtractError(BaseModel):
11
+ content: Optional[str] = None
12
+ """Content returned for http client or server errors, if any."""
13
+
14
+ error_type: str
15
+ """Error type."""
16
+
17
+ http_status_code: Optional[int] = None
18
+ """HTTP status code, if available."""
19
+
20
+ url: str
@@ -0,0 +1,20 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List
4
+
5
+ from ..._models import BaseModel
6
+ from .extract_error import ExtractError
7
+ from .extract_result import ExtractResult
8
+
9
+ __all__ = ["ExtractResponse"]
10
+
11
+
12
+ class ExtractResponse(BaseModel):
13
+ errors: List[ExtractError]
14
+ """Extract errors: requested URLs not in the results."""
15
+
16
+ extract_id: str
17
+ """Extract request ID, e.g. `extract_cad0a6d2dec046bd95ae900527d880e7`"""
18
+
19
+ results: List[ExtractResult]
20
+ """Successful extract results."""
@@ -0,0 +1,23 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+
5
+ from ..._models import BaseModel
6
+
7
+ __all__ = ["ExtractResult"]
8
+
9
+
10
+ class ExtractResult(BaseModel):
11
+ excerpts: Optional[List[str]] = None
12
+ """Relevant excerpted content from the URL, formatted as markdown."""
13
+
14
+ full_content: Optional[str] = None
15
+ """Full content from the URL formatted as markdown, if requested."""
16
+
17
+ publish_date: Optional[str] = None
18
+ """Publish date of the webpage, if available."""
19
+
20
+ title: Optional[str] = None
21
+ """Title of the webpage, if available."""
22
+
23
+ url: str
@@ -123,8 +123,8 @@ class TestTaskGroup:
123
123
  ],
124
124
  "metadata": {"foo": "string"},
125
125
  "source_policy": {
126
- "exclude_domains": ["string"],
127
- "include_domains": ["string"],
126
+ "exclude_domains": ["reddit.com", "x.com"],
127
+ "include_domains": ["wikipedia.org", "usa.gov"],
128
128
  },
129
129
  "task_spec": {
130
130
  "output_schema": {
@@ -422,8 +422,8 @@ class TestAsyncTaskGroup:
422
422
  ],
423
423
  "metadata": {"foo": "string"},
424
424
  "source_policy": {
425
- "exclude_domains": ["string"],
426
- "include_domains": ["string"],
425
+ "exclude_domains": ["reddit.com", "x.com"],
426
+ "include_domains": ["wikipedia.org", "usa.gov"],
427
427
  },
428
428
  "task_spec": {
429
429
  "output_schema": {
@@ -43,8 +43,8 @@ class TestTaskRun:
43
43
  ],
44
44
  metadata={"foo": "string"},
45
45
  source_policy={
46
- "exclude_domains": ["string"],
47
- "include_domains": ["string"],
46
+ "exclude_domains": ["reddit.com", "x.com"],
47
+ "include_domains": ["wikipedia.org", "usa.gov"],
48
48
  },
49
49
  task_spec={
50
50
  "output_schema": {
@@ -211,8 +211,8 @@ class TestAsyncTaskRun:
211
211
  ],
212
212
  metadata={"foo": "string"},
213
213
  source_policy={
214
- "exclude_domains": ["string"],
215
- "include_domains": ["string"],
214
+ "exclude_domains": ["reddit.com", "x.com"],
215
+ "include_domains": ["wikipedia.org", "usa.gov"],
216
216
  },
217
217
  task_spec={
218
218
  "output_schema": {