|
1 | 1 | import logging |
2 | 2 | from typing import TYPE_CHECKING, Annotated |
3 | 3 |
|
4 | | -import httpx |
5 | 4 | from fastapi import APIRouter, Depends, Path, Query, status |
6 | 5 |
|
7 | | -from config import settings |
8 | 6 | from dependencies import OptionalAppHeader, get_api_key, get_db, get_storage |
9 | | -from exceptions import DataNotFoundError, InvalidRequestError |
| 7 | +from exceptions import DataNotFoundError |
10 | 8 | from models.annotation import SegmentWithContextOutput |
11 | | -from models.requests import DirectRelatedSegmentsQueryParams, SegmentsQueryParams |
| 9 | +from models.requests import DirectRelatedSegmentsQueryParams |
12 | 10 | from models.responses import PaginatedResponse |
13 | | -from models.search import SearchFilter, SearchResponse, SearchResult |
14 | 11 |
|
15 | 12 | if TYPE_CHECKING: |
16 | 13 | from database import Database |
@@ -102,101 +99,6 @@ async def untag_segment( |
102 | 99 | await db.tag.untag_segment(segment_id, tag_id) |
103 | 100 |
|
104 | 101 |
|
105 | | -@router.get( |
106 | | - "/search", |
107 | | - summary="Search segments", |
108 | | - description="Search segments using the external search API.", |
109 | | -) |
110 | | -async def search_segments( |
111 | | - query: Annotated[str, Query(description="Search query")], |
112 | | - params: Annotated[SegmentsQueryParams, Query()], |
113 | | - _api_key: Annotated[str, Depends(get_api_key)], |
114 | | - db: Annotated[Database, Depends(get_db)], |
115 | | -) -> SearchResponse: |
116 | | - """Search segments.""" |
117 | | - filter_obj = SearchFilter(title=params.title) if params.title else None |
118 | | - |
119 | | - try: |
120 | | - logger.info("Forwarding search request to %s/search", settings.search_api_url) |
121 | | - |
122 | | - request_params = { |
123 | | - "query": query, |
124 | | - "search_type": params.search_type, |
125 | | - "limit": params.limit, |
126 | | - "return_text": params.return_text, |
127 | | - } |
128 | | - if filter_obj and filter_obj.title: |
129 | | - request_params["title"] = filter_obj.title |
130 | | - |
131 | | - async with httpx.AsyncClient(timeout=60) as client: |
132 | | - response = await client.get(f"{settings.search_api_url}/search", params=request_params) |
133 | | - response.raise_for_status() |
134 | | - search_response_data = response.json() |
135 | | - |
136 | | - except httpx.RequestError: |
137 | | - logger.exception("Error calling search API") |
138 | | - raise InvalidRequestError("Failed to call search API") from None |
139 | | - |
140 | | - enriched_results = [] |
141 | | - |
142 | | - for result_item in search_response_data.get("results", []): |
143 | | - segment_id = result_item.get("id") |
144 | | - if not segment_id: |
145 | | - enriched_results.append( |
146 | | - SearchResult( |
147 | | - id=result_item.get("id", ""), |
148 | | - distance=result_item.get("distance", 0.0), |
149 | | - entity=result_item.get("entity", {}), |
150 | | - segmentation_ids=[], |
151 | | - ) |
152 | | - ) |
153 | | - continue |
154 | | - |
155 | | - try: |
156 | | - segment = await db.segment.get(segment_id) |
157 | | - segmentation_ids = await db.segment.find_by_span( |
158 | | - edition_id=segment.edition_id, |
159 | | - start=segment.span.start, |
160 | | - end=segment.span.end, |
161 | | - ) |
162 | | - enriched_results.append( |
163 | | - SearchResult( |
164 | | - id=result_item.get("id", ""), |
165 | | - distance=result_item.get("distance", 0.0), |
166 | | - entity=result_item.get("entity", {}), |
167 | | - segmentation_ids=segmentation_ids, |
168 | | - ) |
169 | | - ) |
170 | | - except DataNotFoundError: |
171 | | - logger.warning("Segment %s not found, skipping segmentation mapping", segment_id) |
172 | | - enriched_results.append( |
173 | | - SearchResult( |
174 | | - id=result_item.get("id", ""), |
175 | | - distance=result_item.get("distance", 0.0), |
176 | | - entity=result_item.get("entity", {}), |
177 | | - segmentation_ids=[], |
178 | | - ) |
179 | | - ) |
180 | | - except Exception: |
181 | | - logger.exception("Error processing segment %s", segment_id) |
182 | | - enriched_results.append( |
183 | | - SearchResult( |
184 | | - id=result_item.get("id", ""), |
185 | | - distance=result_item.get("distance", 0.0), |
186 | | - entity=result_item.get("entity", {}), |
187 | | - segmentation_ids=[], |
188 | | - ) |
189 | | - ) |
190 | | - |
191 | | - return SearchResponse.model_validate( |
192 | | - { |
193 | | - "query": search_response_data.get("query", query), |
194 | | - "results": enriched_results, |
195 | | - "count": len(enriched_results), |
196 | | - } |
197 | | - ) |
198 | | - |
199 | | - |
200 | 102 | @router.get( |
201 | 103 | "/{segment_id}", |
202 | 104 | summary="Get segment", |
|
0 commit comments