Skip to content

Commit b72b83a

Browse files
committed
feat: Add charts 🎉
1 parent 22c0d83 commit b72b83a

File tree

4 files changed

+109
-7
lines changed

4 files changed

+109
-7
lines changed

asknews_sdk/api/chat.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from asknews_sdk.client import APIClient, AsyncAPIClient
88
from asknews_sdk.dto.alert import AlertLog, AlertResponse, CreateAlertRequest, UpdateAlertRequest
99
from asknews_sdk.dto.chat import (
10+
ChartResponse,
11+
CreateChartRequest,
1012
CreateChatCompletionRequest,
1113
CreateChatCompletionResponse,
1214
CreateChatCompletionResponseStream,
@@ -643,6 +645,32 @@ def _stream():
643645
else:
644646
return CreateDeepNewsResponse.model_validate(response.content)
645647

648+
def create_chart(
649+
self,
650+
payload: CreateChartRequest,
651+
*,
652+
http_headers: Optional[Dict] = None,
653+
) -> ChartResponse:
654+
"""
655+
Create a chart based on news data using a natural language query
656+
"""
657+
658+
response = self.client.request(
659+
method="POST",
660+
endpoint="/v1/chat/charts",
661+
body=payload.model_dump(mode="json")
662+
if isinstance(payload, CreateChartRequest)
663+
else payload,
664+
headers={
665+
**(http_headers or {}),
666+
"Content-Type": CreateChartRequest.__content_type__,
667+
},
668+
accept=[
669+
(ChartResponse.__content_type__, 1.0),
670+
],
671+
)
672+
return ChartResponse.model_validate(response.content)
673+
646674

647675
class AsyncChatAPI(BaseAPI[AsyncAPIClient]):
648676
"""
@@ -1231,3 +1259,29 @@ async def _stream():
12311259
return _stream()
12321260
else:
12331261
return CreateDeepNewsResponse.model_validate(response.content)
1262+
1263+
async def create_chart(
1264+
self,
1265+
payload: CreateChartRequest,
1266+
*,
1267+
http_headers: Optional[Dict] = None,
1268+
) -> ChartResponse:
1269+
"""
1270+
Create a chart based on news data using a natural language query
1271+
"""
1272+
1273+
response = await self.client.request(
1274+
method="POST",
1275+
endpoint="/v1/chat/charts",
1276+
body=payload.model_dump(mode="json")
1277+
if isinstance(payload, CreateChartRequest)
1278+
else payload,
1279+
headers={
1280+
**(http_headers or {}),
1281+
"Content-Type": CreateChartRequest.__content_type__,
1282+
},
1283+
accept=[
1284+
(ChartResponse.__content_type__, 1.0),
1285+
],
1286+
)
1287+
return ChartResponse.model_validate(response.content)

asknews_sdk/api/news.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ def get_index_counts(
313313
:return: The index counts response.
314314
:rtype: IndexCountsResponse
315315
"""
316-
print(f" Datetimes {start_datetime.isoformat()}, {end_datetime.isoformat()}")
317316
response = self.client.request(
318317
method="GET",
319318
endpoint="/v1/index_counts",

asknews_sdk/dto/alert.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"o3-mini",
3232
"claude-3-5-sonnet-latest",
3333
"claude-sonnet-4-20250514",
34+
"claude-sonnet-4-5-20250929",
3435
"meta-llama/Meta-Llama-3.1-405B-Instruct",
3536
"meta-llama/Meta-Llama-3.3-70B-Instruct",
3637
]

asknews_sdk/dto/chat.py

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,10 @@ class CreateChatCompletionRequest(BaseSchema):
6666
asknews_watermark: Annotated[
6767
Optional[bool], Field(title='Append "Generated by AskNews AI" watermark')
6868
] = True
69-
append_references: Annotated[
70-
Optional[bool], Field(title="Append References or not")
71-
] = True
72-
conversational_awareness: Annotated[
73-
Optional[bool], Field(title="Conversational Awareness")
74-
] = False
69+
append_references: Annotated[Optional[bool], Field(title="Append References or not")] = True
70+
conversational_awareness: Annotated[Optional[bool], Field(title="Conversational Awareness")] = (
71+
False
72+
)
7573
filter_params: Annotated[
7674
Optional[Dict[str, Any]],
7775
Field(title="Any filter param available on the /news endpoint."),
@@ -327,3 +325,53 @@ class FilterParamsMetadata(BaseModel):
327325
class FilterParamsResponse(BaseModel):
328326
metadata: FilterParamsMetadata
329327
filter_params: FilterParams
328+
329+
330+
class SeriesConfig(BaseModel):
331+
name: str
332+
start_datetime: datetime
333+
end_datetime: datetime
334+
sampling: Optional[str] = "1d"
335+
time_filter: Optional[str] = "pub_date"
336+
categories: Optional[List[str]] = None
337+
domains: Optional[List[str]] = None
338+
bad_domain_url: Optional[List[str]] = None
339+
page_rank: Optional[int] = None
340+
string_guarantee: Optional[List[str]] = None
341+
string_guarantee_op: Optional[str] = "OR"
342+
reverse_string_guarantee: Optional[List[str]] = None
343+
entity_guarantee: Optional[List[str]] = None
344+
entity_guarantee_op: Optional[str] = "OR"
345+
countries: Optional[List[str]] = None
346+
countries_blacklist: Optional[List[str]] = None
347+
continents: Optional[List[str]] = None
348+
languages: Optional[List[str]] = None
349+
sentiment: Optional[str] = None
350+
reporting_voice: Optional[List[str]] = None
351+
provocative: Optional[str] = "all"
352+
353+
354+
class ChartParameters(BaseModel):
355+
chart_type: Literal["line", "bar", "bar_pct"] = Field(
356+
..., description="The type of chart to create"
357+
)
358+
title: Optional[str] = Field(None, description="The title of the chart")
359+
series: List[SeriesConfig] = Field(..., description="The series configurations for the chart")
360+
361+
362+
class CreateChartRequest(BaseSchema):
363+
query: str = Field(..., description="The chart query to create")
364+
365+
366+
class ChartResponse(BaseSchema):
367+
success: bool
368+
chart_json: Annotated[
369+
dict, Field(description="The plotly fig.to_json() JSON representation of the chart")
370+
]
371+
query: str = None
372+
reasoning: Optional[str] = None
373+
parameters: Optional[ChartParameters] = None
374+
context: Optional[dict] = None
375+
iterations_used: Optional[int] = None
376+
last_reasoning: Optional[str] = None
377+
last_parameters: Optional[ChartParameters] = None

0 commit comments

Comments
 (0)