unique-search-proxy-sdk 2026.44.0.dev3__tar.gz → 2026.44.0.dev5__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.
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/PKG-INFO +2 -2
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/pyproject.toml +2 -2
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/__init__.py +2 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/agent_search_response.py +32 -3
- unique_search_proxy_sdk-2026.44.0.dev5/unique_search_proxy_sdk/_generated/models/answer_span_citation.py +132 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/errors.py +2 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/README.md +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_endpoint.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/agent_search/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/agent_search/agent_search_stream_v1_agent_search_stream_post.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/agent_search/agent_search_v1_agent_search_post.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/configuration/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/configuration/list_providers_v1_configuration_providers_get.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/crawl/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/crawl/crawl_v1_crawl_post.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/health/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/health/health_health_get.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/health/ready_ready_get.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/search/__init__.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/api/search/search_v1_search_post.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/client.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/errors.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/basic_crawl_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/bing_agent_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/bing_agent_search_request_freshness_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/bing_agent_search_request_market_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_country_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_result_filter_type_0_item.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_safe_search.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_search_lang_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_ui_language.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/brave_search_request_units_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/content_types.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/crawl_response.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/crawl_url_result.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/custom_api_request_method.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/custom_api_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/firecrawl_crawl_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/firecrawl_crawl_request_proxy_mode.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/firecrawl_crawl_request_scrape_headers_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/google_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/google_search_request_safe_search.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/google_search_request_site_search_filter_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/health_health_get_response_health_health_get.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/http_validation_error.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/jina_crawl_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/jina_crawl_request_engine.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/jina_crawl_request_retain_images_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/jina_crawl_request_return_format.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/per_url_error.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/perplexity_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/perplexity_search_request_search_context_size.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/perplexity_search_request_search_recency_filter_type_0.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/providers_list_response.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/ready_ready_get_response_ready_ready_get.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/search_response.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/tavily_crawl_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/tavily_crawl_request_extract_depth.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/tavily_crawl_request_output_format.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/validation_error.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/validation_error_context.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/vertex_ai_agent_search_request.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/models/web_search_result.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_generated/types.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_http.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_transport.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/_typed_endpoints.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/agent_search_client.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/client.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/converters.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/crawl_client.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/search_client.py +0 -0
- {unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/unique_search_proxy_sdk/typing_checks.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: unique-search-proxy-sdk
|
|
3
|
-
Version: 2026.44.0.
|
|
3
|
+
Version: 2026.44.0.dev5
|
|
4
4
|
Summary: Async HTTP client for the Unique Search Proxy API
|
|
5
5
|
Author: ThePhilAz
|
|
6
6
|
Author-email: ThePhilAz <rami.azouz@philico.com>
|
|
7
7
|
Requires-Dist: attrs>=24.3.0,<26
|
|
8
8
|
Requires-Dist: httpx>=0.28.0,<0.29.0
|
|
9
9
|
Requires-Dist: pydantic>=2.12.5,<3.0.0
|
|
10
|
-
Requires-Dist: unique-search-proxy-core>=2026.44.0.
|
|
10
|
+
Requires-Dist: unique-search-proxy-core>=2026.44.0.dev10,<2026.44.0rc0
|
|
11
11
|
Requires-Python: >=3.12
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
|
{unique_search_proxy_sdk-2026.44.0.dev3 → unique_search_proxy_sdk-2026.44.0.dev5}/pyproject.toml
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "unique-search-proxy-sdk"
|
|
3
|
-
version = "2026.44.0.
|
|
3
|
+
version = "2026.44.0.dev5"
|
|
4
4
|
description = "Async HTTP client for the Unique Search Proxy API"
|
|
5
5
|
authors = [{ name = "ThePhilAz", email = "rami.azouz@philico.com" }]
|
|
6
6
|
readme = "README.md"
|
|
@@ -9,7 +9,7 @@ dependencies = [
|
|
|
9
9
|
"attrs>=24.3.0,<26",
|
|
10
10
|
"httpx>=0.28.0,<0.29.0",
|
|
11
11
|
"pydantic>=2.12.5,<3.0.0",
|
|
12
|
-
"unique-search-proxy-core>=2026.44.0.
|
|
12
|
+
"unique-search-proxy-core>=2026.44.0.dev10,<2026.44.0rc0",
|
|
13
13
|
]
|
|
14
14
|
|
|
15
15
|
[dependency-groups]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Contains all the data models used in inputs/outputs"""
|
|
2
2
|
|
|
3
3
|
from .agent_search_response import AgentSearchResponse
|
|
4
|
+
from .answer_span_citation import AnswerSpanCitation
|
|
4
5
|
from .basic_crawl_request import BasicCrawlRequest
|
|
5
6
|
from .bing_agent_search_request import BingAgentSearchRequest
|
|
6
7
|
from .bing_agent_search_request_freshness_type_0 import (
|
|
@@ -60,6 +61,7 @@ from .web_search_result import WebSearchResult
|
|
|
60
61
|
|
|
61
62
|
__all__ = (
|
|
62
63
|
"AgentSearchResponse",
|
|
64
|
+
"AnswerSpanCitation",
|
|
63
65
|
"BasicCrawlRequest",
|
|
64
66
|
"BingAgentSearchRequest",
|
|
65
67
|
"BingAgentSearchRequestFreshnessType0",
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from collections.abc import Mapping
|
|
4
|
-
from typing import Any, TypeVar
|
|
4
|
+
from typing import TYPE_CHECKING, Any, TypeVar
|
|
5
5
|
|
|
6
6
|
from attrs import define as _attrs_define
|
|
7
7
|
from attrs import field as _attrs_field
|
|
8
8
|
|
|
9
9
|
from ..types import UNSET, Unset
|
|
10
10
|
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ..models.answer_span_citation import AnswerSpanCitation
|
|
13
|
+
|
|
14
|
+
|
|
11
15
|
T = TypeVar("T", bound="AgentSearchResponse")
|
|
12
16
|
|
|
13
17
|
|
|
@@ -15,19 +19,23 @@ T = TypeVar("T", bound="AgentSearchResponse")
|
|
|
15
19
|
class AgentSearchResponse:
|
|
16
20
|
"""Result of an agent-based (grounded) search.
|
|
17
21
|
|
|
18
|
-
Thin egress contract: opaque ``answer`` text from the provider
|
|
19
|
-
|
|
22
|
+
Thin egress contract: opaque ``answer`` text from the provider, the
|
|
23
|
+
citations the provider attached to it, and ``raw`` for debugging. Consumers
|
|
24
|
+
interpret ``answer`` (JSON parsing, mapping citations, etc.).
|
|
20
25
|
|
|
21
26
|
Attributes:
|
|
22
27
|
engine (str):
|
|
23
28
|
query (str):
|
|
24
29
|
answer (str | Unset): Agent response text as returned by the provider (opaque to the proxy) Default: ''.
|
|
30
|
+
citations (list[AnswerSpanCitation] | Unset): Sources cited in the answer. Only Grounding with Bing Search
|
|
31
|
+
reports citations; other engines return an empty list.
|
|
25
32
|
raw (Any | Unset): Opaque provider payload
|
|
26
33
|
"""
|
|
27
34
|
|
|
28
35
|
engine: str
|
|
29
36
|
query: str
|
|
30
37
|
answer: str | Unset = ""
|
|
38
|
+
citations: list[AnswerSpanCitation] | Unset = UNSET
|
|
31
39
|
raw: Any | Unset = UNSET
|
|
32
40
|
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
33
41
|
|
|
@@ -38,6 +46,13 @@ class AgentSearchResponse:
|
|
|
38
46
|
|
|
39
47
|
answer = self.answer
|
|
40
48
|
|
|
49
|
+
citations: list[dict[str, Any]] | Unset = UNSET
|
|
50
|
+
if not isinstance(self.citations, Unset):
|
|
51
|
+
citations = []
|
|
52
|
+
for citations_item_data in self.citations:
|
|
53
|
+
citations_item = citations_item_data.to_dict()
|
|
54
|
+
citations.append(citations_item)
|
|
55
|
+
|
|
41
56
|
raw = self.raw
|
|
42
57
|
|
|
43
58
|
field_dict: dict[str, Any] = {}
|
|
@@ -50,6 +65,8 @@ class AgentSearchResponse:
|
|
|
50
65
|
)
|
|
51
66
|
if answer is not UNSET:
|
|
52
67
|
field_dict["answer"] = answer
|
|
68
|
+
if citations is not UNSET:
|
|
69
|
+
field_dict["citations"] = citations
|
|
53
70
|
if raw is not UNSET:
|
|
54
71
|
field_dict["raw"] = raw
|
|
55
72
|
|
|
@@ -57,6 +74,8 @@ class AgentSearchResponse:
|
|
|
57
74
|
|
|
58
75
|
@classmethod
|
|
59
76
|
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
77
|
+
from ..models.answer_span_citation import AnswerSpanCitation
|
|
78
|
+
|
|
60
79
|
d = dict(src_dict)
|
|
61
80
|
engine = d.pop("engine")
|
|
62
81
|
|
|
@@ -64,12 +83,22 @@ class AgentSearchResponse:
|
|
|
64
83
|
|
|
65
84
|
answer = d.pop("answer", UNSET)
|
|
66
85
|
|
|
86
|
+
_citations = d.pop("citations", UNSET)
|
|
87
|
+
citations: list[AnswerSpanCitation] | Unset = UNSET
|
|
88
|
+
if _citations is not UNSET:
|
|
89
|
+
citations = []
|
|
90
|
+
for citations_item_data in _citations:
|
|
91
|
+
citations_item = AnswerSpanCitation.from_dict(citations_item_data)
|
|
92
|
+
|
|
93
|
+
citations.append(citations_item)
|
|
94
|
+
|
|
67
95
|
raw = d.pop("raw", UNSET)
|
|
68
96
|
|
|
69
97
|
agent_search_response = cls(
|
|
70
98
|
engine=engine,
|
|
71
99
|
query=query,
|
|
72
100
|
answer=answer,
|
|
101
|
+
citations=citations,
|
|
73
102
|
raw=raw,
|
|
74
103
|
)
|
|
75
104
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, cast
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
T = TypeVar("T", bound="AnswerSpanCitation")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@_attrs_define
|
|
15
|
+
class AnswerSpanCitation:
|
|
16
|
+
"""A source cited at a specific span of the answer text.
|
|
17
|
+
|
|
18
|
+
Grounding with Bing Search reports these as ``url_citation`` annotations:
|
|
19
|
+
the agent writes a marker such as ``【4:0†source】`` into its answer, and
|
|
20
|
+
Foundry attaches the source to that marker's character span.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
url (str): URL of the cited source
|
|
24
|
+
marker (str): Answer text between start_index and end_index
|
|
25
|
+
start_index (int): Character offset in the answer where the marker starts
|
|
26
|
+
end_index (int): Character offset in the answer just past the marker
|
|
27
|
+
title (None | str | Unset): Title of the cited source
|
|
28
|
+
output_item_id (None | str | Unset): Output item the citation is attached to, if the provider reports one
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
url: str
|
|
32
|
+
marker: str
|
|
33
|
+
start_index: int
|
|
34
|
+
end_index: int
|
|
35
|
+
title: None | str | Unset = UNSET
|
|
36
|
+
output_item_id: None | str | Unset = UNSET
|
|
37
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
38
|
+
|
|
39
|
+
def to_dict(self) -> dict[str, Any]:
|
|
40
|
+
url = self.url
|
|
41
|
+
|
|
42
|
+
marker = self.marker
|
|
43
|
+
|
|
44
|
+
start_index = self.start_index
|
|
45
|
+
|
|
46
|
+
end_index = self.end_index
|
|
47
|
+
|
|
48
|
+
title: None | str | Unset
|
|
49
|
+
if isinstance(self.title, Unset):
|
|
50
|
+
title = UNSET
|
|
51
|
+
else:
|
|
52
|
+
title = self.title
|
|
53
|
+
|
|
54
|
+
output_item_id: None | str | Unset
|
|
55
|
+
if isinstance(self.output_item_id, Unset):
|
|
56
|
+
output_item_id = UNSET
|
|
57
|
+
else:
|
|
58
|
+
output_item_id = self.output_item_id
|
|
59
|
+
|
|
60
|
+
field_dict: dict[str, Any] = {}
|
|
61
|
+
field_dict.update(self.additional_properties)
|
|
62
|
+
field_dict.update(
|
|
63
|
+
{
|
|
64
|
+
"url": url,
|
|
65
|
+
"marker": marker,
|
|
66
|
+
"startIndex": start_index,
|
|
67
|
+
"endIndex": end_index,
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
if title is not UNSET:
|
|
71
|
+
field_dict["title"] = title
|
|
72
|
+
if output_item_id is not UNSET:
|
|
73
|
+
field_dict["outputItemId"] = output_item_id
|
|
74
|
+
|
|
75
|
+
return field_dict
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
79
|
+
d = dict(src_dict)
|
|
80
|
+
url = d.pop("url")
|
|
81
|
+
|
|
82
|
+
marker = d.pop("marker")
|
|
83
|
+
|
|
84
|
+
start_index = d.pop("startIndex")
|
|
85
|
+
|
|
86
|
+
end_index = d.pop("endIndex")
|
|
87
|
+
|
|
88
|
+
def _parse_title(data: object) -> None | str | Unset:
|
|
89
|
+
if data is None:
|
|
90
|
+
return data
|
|
91
|
+
if isinstance(data, Unset):
|
|
92
|
+
return data
|
|
93
|
+
return cast(None | str | Unset, data)
|
|
94
|
+
|
|
95
|
+
title = _parse_title(d.pop("title", UNSET))
|
|
96
|
+
|
|
97
|
+
def _parse_output_item_id(data: object) -> None | str | Unset:
|
|
98
|
+
if data is None:
|
|
99
|
+
return data
|
|
100
|
+
if isinstance(data, Unset):
|
|
101
|
+
return data
|
|
102
|
+
return cast(None | str | Unset, data)
|
|
103
|
+
|
|
104
|
+
output_item_id = _parse_output_item_id(d.pop("outputItemId", UNSET))
|
|
105
|
+
|
|
106
|
+
answer_span_citation = cls(
|
|
107
|
+
url=url,
|
|
108
|
+
marker=marker,
|
|
109
|
+
start_index=start_index,
|
|
110
|
+
end_index=end_index,
|
|
111
|
+
title=title,
|
|
112
|
+
output_item_id=output_item_id,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
answer_span_citation.additional_properties = d
|
|
116
|
+
return answer_span_citation
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def additional_keys(self) -> list[str]:
|
|
120
|
+
return list(self.additional_properties.keys())
|
|
121
|
+
|
|
122
|
+
def __getitem__(self, key: str) -> Any:
|
|
123
|
+
return self.additional_properties[key]
|
|
124
|
+
|
|
125
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
126
|
+
self.additional_properties[key] = value
|
|
127
|
+
|
|
128
|
+
def __delitem__(self, key: str) -> None:
|
|
129
|
+
del self.additional_properties[key]
|
|
130
|
+
|
|
131
|
+
def __contains__(self, key: str) -> bool:
|
|
132
|
+
return key in self.additional_properties
|
|
@@ -12,6 +12,7 @@ from unique_search_proxy_core.errors import (
|
|
|
12
12
|
ForbiddenTargetError,
|
|
13
13
|
ProxyError,
|
|
14
14
|
RateLimitedError,
|
|
15
|
+
ResponseTooLargeError,
|
|
15
16
|
UpstreamError,
|
|
16
17
|
UpstreamTimeoutError,
|
|
17
18
|
ValidationProxyError,
|
|
@@ -28,6 +29,7 @@ _CODE_TO_EXCEPTION: dict[str, type[ProxyError]] = {
|
|
|
28
29
|
ProxyErrorCode.ENGINE_NOT_CONFIGURED.value: EngineNotConfiguredError,
|
|
29
30
|
ProxyErrorCode.UPSTREAM_TIMEOUT.value: UpstreamTimeoutError,
|
|
30
31
|
ProxyErrorCode.EMPTY_SEARCH_RESULTS.value: EmptySearchResultsError,
|
|
32
|
+
ProxyErrorCode.RESPONSE_TOO_LARGE.value: ResponseTooLargeError,
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|