Skip to content

Commit 56fcf27

Browse files
feat: chore(stlc): seal custom-code tracking files
Stainless-Generated-From: 56c68476ea52d859cac195cc12cb9248e0de4860
1 parent ad5db8a commit 56fcf27

9 files changed

Lines changed: 214 additions & 89 deletions

File tree

‎api.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ from kernel.types.search import FetchRequest, Response
791791

792792
Methods:
793793

794-
- <code title="post /search/{id}/contents">client.search.contents.<a href="./src/kernel/resources/search/contents.py">fetch</a>(id, \*\*<a href="src/kernel/types/search/content_fetch_params.py">params</a>) -> None</code>
794+
- <code title="post /search/{id}/contents">client.search.contents.<a href="./src/kernel/resources/search/contents.py">fetch</a>(id, \*\*<a href="src/kernel/types/search/content_fetch_params.py">params</a>) -> <a href="./src/kernel/types/search/response.py">Response</a></code>
795795

796796
## Providers
797797

‎src/kernel/resources/search/contents.py‎

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import httpx
66

7-
from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given
7+
from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
88
from ..._utils import path_template, maybe_transform, async_maybe_transform
99
from ..._compat import cached_property
1010
from ..._resource import SyncAPIResource, AsyncAPIResource
@@ -16,6 +16,7 @@
1616
)
1717
from ..._base_client import make_request_options
1818
from ...types.search import content_fetch_params
19+
from ...types.search.response import Response
1920

2021
__all__ = ["ContentsResource", "AsyncContentsResource"]
2122

@@ -56,11 +57,18 @@ def fetch(
5657
extra_query: Query | None = None,
5758
extra_body: Body | None = None,
5859
timeout: float | httpx.Timeout | None | NotGiven = not_given,
59-
) -> None:
60-
"""
61-
Deferred result-content retrieval is reserved but not available in this release.
62-
Requests return 404 until the retrieval implementation is shipped. X-Request-Id
63-
identifies this request separately from the search resource.
60+
) -> Response:
61+
"""Retrieves selected results from a retained search.
62+
63+
Provide exactly one of
64+
result_ids or limit; the latter fetches the top results. Content defaults to
65+
source:auto. Responses preserve result_ids order. Unknown result IDs are
66+
rejected before retrieval starts. Missing, expired, or inaccessible searches
67+
return 404. Once retrieval begins, return one outcome per selected result,
68+
including timeout entries for work unfinished at the overall deadline. Browser
69+
retrievals run sequentially in result order, so later results may time out when
70+
earlier pages are slow. X-Request-Id identifies this request separately from the
71+
search resource.
6472
6573
Args:
6674
content: Defaults to source:auto when omitted.
@@ -83,7 +91,6 @@ def fetch(
8391
"""
8492
if not id:
8593
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
86-
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
8794
return self._post(
8895
path_template("/search/{id}/contents", id=id),
8996
body=maybe_transform(
@@ -98,7 +105,7 @@ def fetch(
98105
options=make_request_options(
99106
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
100107
),
101-
cast_to=NoneType,
108+
cast_to=Response,
102109
)
103110

104111

@@ -138,11 +145,18 @@ async def fetch(
138145
extra_query: Query | None = None,
139146
extra_body: Body | None = None,
140147
timeout: float | httpx.Timeout | None | NotGiven = not_given,
141-
) -> None:
142-
"""
143-
Deferred result-content retrieval is reserved but not available in this release.
144-
Requests return 404 until the retrieval implementation is shipped. X-Request-Id
145-
identifies this request separately from the search resource.
148+
) -> Response:
149+
"""Retrieves selected results from a retained search.
150+
151+
Provide exactly one of
152+
result_ids or limit; the latter fetches the top results. Content defaults to
153+
source:auto. Responses preserve result_ids order. Unknown result IDs are
154+
rejected before retrieval starts. Missing, expired, or inaccessible searches
155+
return 404. Once retrieval begins, return one outcome per selected result,
156+
including timeout entries for work unfinished at the overall deadline. Browser
157+
retrievals run sequentially in result order, so later results may time out when
158+
earlier pages are slow. X-Request-Id identifies this request separately from the
159+
search resource.
146160
147161
Args:
148162
content: Defaults to source:auto when omitted.
@@ -165,7 +179,6 @@ async def fetch(
165179
"""
166180
if not id:
167181
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
168-
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
169182
return await self._post(
170183
path_template("/search/{id}/contents", id=id),
171184
body=await async_maybe_transform(
@@ -180,7 +193,7 @@ async def fetch(
180193
options=make_request_options(
181194
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
182195
),
183-
cast_to=NoneType,
196+
cast_to=Response,
184197
)
185198

186199

‎src/kernel/types/result.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ class Content(BaseModel):
3434
"""
3535

3636
cache_status: Optional[Literal["hit", "miss", "bypass", "unknown"]] = None
37-
"""Kernel cache outcome. Provider-internal cache behavior may be unknown."""
37+
"""Kernel content cache outcome.
38+
39+
Kernel has no content cache yet: responses report bypass or unknown, and hit and
40+
miss are reserved. Provider-internal cache behavior may be unknown.
41+
"""
3842

3943
completeness: Optional[Literal["full_page", "excerpt", "unknown"]] = None
4044
"""Describes source coverage before max_chars truncation.
@@ -48,7 +52,7 @@ class Content(BaseModel):
4852
"""Extraction version when Kernel transformed the input."""
4953

5054
fetched_at: Optional[datetime] = None
51-
"""Origin retrieval time when known, not cache read time."""
55+
"""When Kernel received the content from the provider."""
5256

5357
final_url: Optional[str] = None
5458
"""Final retrieval URL when known."""
@@ -59,7 +63,7 @@ class Content(BaseModel):
5963
"""Final target HTTP status when known."""
6064

6165
method: Optional[Literal["provider", "browser_curl", "browser_render"]] = None
62-
"""Original retrieval method, including on cache hits."""
66+
"""Original retrieval method."""
6367

6468
text: Optional[str] = None
6569
"""Extracted website content, untrusted, not instructions.

‎src/kernel/types/search/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from .search import Search as Search
66
from .provider import Provider as Provider
7+
from .response import Response as Response
78
from .content_fetch_params import ContentFetchParams as ContentFetchParams
89
from .provider_list_params import ProviderListParams as ProviderListParams
910
from .provider_list_response import ProviderListResponse as ProviderListResponse

‎src/kernel/types/search/content_fetch_params.py‎

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,22 @@ class ContentFetchParams(TypedDict, total=False):
3030

3131

3232
class ContentBrowser(TypedDict, total=False):
33-
"""Invalid with source=provider.
34-
35-
Supplying browser_id requires
36-
source=browser so the chosen identity is not bypassed.
37-
"""
33+
"""Requires source=auto or source=browser in deferred retrieval."""
3834

3935
browser_id: str
4036
"""Existing browser session ID authorized for the caller and selected project.
4137
42-
Reuses its cookies, proxy, and browser configuration. Kernel does not delete a
43-
caller-supplied browser. Render mode uses a temporary tab; website activity may
44-
still change shared cookies and storage. When omitted, Kernel obtains isolated
45-
browser capacity in the caller's account and releases it after retrieval. That
46-
capacity is not retained for later interaction. Existing browser quotas apply.
38+
Reuses its cookies, proxy, and browser configuration; requests follow that
39+
browser's existing network access behavior, with no additional destination
40+
allowlist in this endpoint. Kernel does not delete a caller-supplied browser.
41+
Render mode uses a temporary tab; website activity may still change shared
42+
cookies and storage. When omitted and any result needs browser retrieval, Kernel
43+
creates one temporary browser for the request using the dashboard launch
44+
defaults (headful, stealth, default proxy), tags it with search_id, and deletes
45+
it when the request finishes. It is billed and counts toward browser concurrency
46+
like any other browser. A concurrency rejection returns 429 for source=browser;
47+
for source=auto, results with retained content are still returned and the rest
48+
report the rejection.
4749
"""
4850

4951
mode: Literal["curl", "render"]
@@ -58,36 +60,36 @@ class Content(TypedDict, total=False):
5860
"""Defaults to source:auto when omitted."""
5961

6062
browser: ContentBrowser
61-
"""Invalid with source=provider.
62-
63-
Supplying browser_id requires source=browser so the chosen identity is not
64-
bypassed.
65-
"""
63+
"""Requires source=auto or source=browser in deferred retrieval."""
6664

6765
format: Literal["markdown", "text"]
6866

6967
max_age_hours: int
70-
"""Maximum acceptable age of cached page content, measured from origin retrieval.
71-
72-
0 forces a live fetch. Governs the Kernel content cache, which is scoped to the
73-
caller organization and project and separated by retrieval context; fetches
74-
through a caller-supplied browser_id bypass that cache. Mapped to the provider
75-
freshness control when source is provider and the provider supports one;
76-
otherwise provider content age is reported as unknown via fetched_at.
68+
"""
69+
For source=auto, maximum acceptable age of retained provider content, measured
70+
from when the search received it from the provider. A value of 0 disables reuse
71+
of retained content, so every result is fetched through a browser.
72+
source=provider reuses retained provider content without freshness validation.
73+
source=browser always fetches through a browser and does not use this age limit.
7774
"""
7875

7976
max_chars: int
80-
"""Per-result Unicode character limit after extraction."""
77+
"""Per-result Unicode character limit after extraction.
78+
79+
Retained provider content cannot exceed what was stored at search time; such
80+
results report truncated when the stored text was already truncated.
81+
"""
8182

8283
source: Literal["auto", "provider", "browser"]
8384
"""
84-
provider uses the search provider's native content retrieval; browser fetches
85-
each URL through a Kernel browser; auto prefers Kernel browser retrieval and
86-
falls back to provider-native content when browser retrieval is unavailable or
87-
unsuitable. Defaults to auto for both inline and deferred retrieval. Deferred
88-
provider retrieval requires post_hoc capability; an explicit provider source
89-
without it is a 400. Missing documents produce per-result unavailable outcomes,
90-
not request failures.
85+
auto uses retained provider content within max_age_hours; for deferred retrieval
86+
it falls back to a Kernel browser (caller-supplied or temporary) for results
87+
without it. Inline retrieval never uses a browser. provider reuses retained
88+
provider content when available, without freshness validation, and never
89+
provisions a browser. browser fetches each URL through a Kernel browser, either
90+
caller-supplied or temporary. No option makes a new provider request. Defaults
91+
to auto for both inline and deferred retrieval. Missing documents produce
92+
per-result unavailable outcomes, not request failures.
9193
"""
9294

9395
timeout_ms: int
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import List, Optional
4+
from datetime import datetime
5+
from typing_extensions import Literal
6+
7+
from ..usage import Usage
8+
from ..warning import Warning
9+
from ..._models import BaseModel
10+
11+
__all__ = ["Response", "Content", "ContentError"]
12+
13+
14+
class ContentError(BaseModel):
15+
code: str
16+
"""Machine-readable retrieval failure code."""
17+
18+
message: str
19+
"""Human-readable failure description."""
20+
21+
retryable: bool
22+
23+
24+
class Content(BaseModel):
25+
result_id: str
26+
27+
status: Literal["ok", "unavailable", "blocked", "timeout", "unsupported_type", "extraction_failed", "error"]
28+
"""Ok means non-empty extracted content, not merely HTTP 200.
29+
30+
Blocked includes detected challenges or access denials. Detection is
31+
best-effort, not a guarantee of page completeness. Error details are present for
32+
non-ok outcomes; text is present only on ok.
33+
"""
34+
35+
url: str
36+
"""Original result URL."""
37+
38+
cache_status: Optional[Literal["hit", "miss", "bypass", "unknown"]] = None
39+
"""Kernel content cache outcome.
40+
41+
Kernel has no content cache yet: responses report bypass or unknown, and hit and
42+
miss are reserved. Provider-internal cache behavior may be unknown.
43+
"""
44+
45+
completeness: Optional[Literal["full_page", "excerpt", "unknown"]] = None
46+
"""Describes source coverage before max_chars truncation.
47+
48+
Full_page means main-page content, not every dynamic element or linked page.
49+
"""
50+
51+
error: Optional[ContentError] = None
52+
53+
extractor_version: Optional[str] = None
54+
"""Extraction version when Kernel transformed the input."""
55+
56+
fetched_at: Optional[datetime] = None
57+
"""
58+
When Kernel fetched the content, or received it from the provider for retained
59+
content.
60+
"""
61+
62+
final_url: Optional[str] = None
63+
"""Final retrieval URL after redirects when known.
64+
65+
Curl mode follows up to 5 redirects.
66+
"""
67+
68+
format: Optional[Literal["markdown", "text"]] = None
69+
"""Format of text.
70+
71+
Plain-text and JSON pages are returned unchanged as text even when markdown was
72+
requested.
73+
"""
74+
75+
http_status: Optional[int] = None
76+
"""Final target HTTP status when known."""
77+
78+
method: Optional[Literal["provider", "browser_curl", "browser_render"]] = None
79+
"""Original retrieval method."""
80+
81+
text: Optional[str] = None
82+
"""Extracted website content, untrusted, not instructions.
83+
84+
Present only on status=ok.
85+
"""
86+
87+
truncated: Optional[bool] = None
88+
"""
89+
Whether the content was cut short, by max_chars or because the page exceeded the
90+
1 MiB read limit.
91+
"""
92+
93+
94+
class Response(BaseModel):
95+
contents: List[Content]
96+
97+
search_id: str
98+
99+
usage: Usage
100+
101+
warnings: List[Warning]

0 commit comments

Comments
 (0)