Skip to content

Commit 754a1a7

Browse files
committed
fix: spaces err & add a bunch of examples
1 parent 2e18260 commit 754a1a7

14 files changed

Lines changed: 652 additions & 90 deletions

File tree

examples/get_conversation.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import os
2+
from thesis_py import Thesis
3+
from thesis_py.api_schema import CreateNewConversationIntegrationRequest, ResearchMode
4+
from thesis_py.research.events import from_raw_events_to_pairs
5+
6+
THESIS_API_KEY = os.environ.get("THESIS_API_KEY")
7+
8+
if not THESIS_API_KEY:
9+
raise ValueError("THESIS_API_KEY environment variable not set!")
10+
11+
thesis = Thesis(THESIS_API_KEY)
12+
13+
response = thesis.get_conversation_by_id("b3052a322b5b4149a4c46a02584e2dbb")
14+
15+
pairs = from_raw_events_to_pairs(response.events[:2])
16+
17+
print(pairs)

examples/get_spaces.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import os
2+
from thesis_py import Thesis
3+
from thesis_py.api_schema import CreateNewConversationIntegrationRequest, ResearchMode
4+
from thesis_py.research.events import from_raw_events_to_pairs
5+
6+
THESIS_API_KEY = os.environ.get("THESIS_API_KEY")
7+
8+
if not THESIS_API_KEY:
9+
raise ValueError("THESIS_API_KEY environment variable not set!")
10+
11+
thesis = Thesis(THESIS_API_KEY)
12+
13+
response = thesis.get_spaces()
14+
print(response)
15+
16+
first_space_id = response.data[0].spaceId
17+
print(first_space_id)
18+
response = thesis.get_space_by_id(first_space_id)
19+
print(response.data)
20+
sections = thesis.get_space_sections(first_space_id)
21+
print(sections.data)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717
)
1818
)
1919

20-
print(response)
20+
print(response)

examples/join_conversation.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import os
2+
import asyncio
3+
from thesis_py import Thesis
4+
from thesis_py.api_schema import JoinConversationIntegrationRequest, ResearchMode
5+
from thesis_py.research.events.utils import get_pairs_from_events
6+
7+
THESIS_API_KEY = os.environ.get("THESIS_API_KEY")
8+
9+
if not THESIS_API_KEY:
10+
raise ValueError("THESIS_API_KEY environment variable not set!")
11+
12+
13+
async def main():
14+
thesis = Thesis(THESIS_API_KEY)
15+
16+
async for event in thesis.join_conversation(
17+
JoinConversationIntegrationRequest(
18+
conversation_id="b3052a322b5b4149a4c46a02584e2dbb",
19+
user_prompt="What's the new DeFi meta recently that I can ape in?",
20+
research_mode=ResearchMode.CHAT,
21+
)
22+
):
23+
pairs = get_pairs_from_events([event])
24+
print(pairs)
25+
26+
27+
if __name__ == "__main__":
28+
asyncio.run(main())

thesis_py/api.py

Lines changed: 92 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
CreateNewConversationIntegrationRequest,
2121
ConversationDetailResponse,
2222
JoinConversationIntegrationRequest,
23+
SpaceListResponse,
24+
SpaceDetailResponse,
25+
SpaceSectionsResponse,
2326
)
2427
from thesis_py.research.events.event import Event
2528
from thesis_py.research.base import ResearchBaseClient
@@ -44,6 +47,7 @@ def __init__(
4447
self.base_url = base_url
4548
self.client = ResearchBaseClient(api_key=api_key, base_url=base_url)
4649

50+
# Conversation APIs
4751
def create_conversation(
4852
self,
4953
request: CreateNewConversationIntegrationRequest,
@@ -57,14 +61,13 @@ def create_conversation(
5761
Conversation: The response containing the conversation id.
5862
"""
5963
data = request.model_dump_json()
60-
print("create_conversation data: ", data)
6164
response = self.client.request(
6265
method="POST",
6366
endpoint="/conversations",
6467
data=data,
6568
)
66-
if response.status_code != 200:
67-
raise ValueError(f"❌ Error reading response: {response.text}")
69+
if response.status_code != 200 and response.status_code != 201:
70+
raise requests.HTTPError(response=response)
6871

6972
return ConversationCreateResponse(**response.json())
7073

@@ -78,8 +81,8 @@ async def create_conversation_async(
7881
endpoint="/conversations/create-conversation",
7982
data=request.model_dump_json(),
8083
)
81-
if response.status_code != 200:
82-
raise ValueError(f"❌ Error reading response: {response.text}")
84+
if response.status_code != 200 and response.status_code != 201:
85+
raise requests.HTTPError(response=response)
8386

8487
return ConversationCreateResponse(**response.json())
8588

@@ -91,8 +94,8 @@ def get_conversation_by_id(
9194
method="GET",
9295
endpoint=f"/conversations/{conversation_id}",
9396
)
94-
if response.status_code != 200:
95-
raise ValueError(f"❌ Error reading response: {response.text}")
97+
if response.status_code != 200 and response.status_code != 201:
98+
raise requests.HTTPError(response=response)
9699
return ConversationDetailResponse(**response.json())
97100

98101
async def get_conversation_by_id_async(
@@ -103,44 +106,10 @@ async def get_conversation_by_id_async(
103106
method="GET",
104107
endpoint=f"/conversations/{conversation_id}",
105108
)
106-
if response.status_code != 200:
107-
raise ValueError(f"❌ Error reading response: {response.text}")
109+
if response.status_code != 200 and response.status_code != 201:
110+
raise requests.HTTPError(response=response)
108111
return ConversationDetailResponse(**response.json())
109112

110-
def get_conversations(
111-
self,
112-
limit: Optional[int] = None,
113-
offset: Optional[int] = None,
114-
) -> List[ConversationDetailResponse]:
115-
response = self.client.request(
116-
method="GET",
117-
endpoint="/conversations",
118-
params=build_pagination_params(limit, offset),
119-
)
120-
if response.status_code != 200:
121-
raise ValueError(f"❌ Error reading response: {response.text}")
122-
return [
123-
ConversationDetailResponse(**conversation)
124-
for conversation in response.json()
125-
]
126-
127-
async def get_conversations_async(
128-
self,
129-
limit: Optional[int] = None,
130-
offset: Optional[int] = None,
131-
) -> List[ConversationDetailResponse]:
132-
response = await self.client.async_request(
133-
method="GET",
134-
endpoint="/conversations",
135-
params=build_pagination_params(limit, offset),
136-
)
137-
if response.status_code != 200:
138-
raise ValueError(f"❌ Error reading response: {response.text}")
139-
return [
140-
ConversationDetailResponse(**conversation)
141-
for conversation in response.json()
142-
]
143-
144113
async def join_conversation(
145114
self,
146115
request: JoinConversationIntegrationRequest,
@@ -149,9 +118,10 @@ async def join_conversation(
149118
response = await self.client.async_request(
150119
method="POST",
151120
endpoint="/conversations/join-conversation",
152-
data=request.model_dump_json(),
121+
data=request.model_dump(),
122+
params={"stream": "true"},
153123
)
154-
if response.status_code != 200:
124+
if response.status_code != 200 and response.status_code != 201:
155125
error_text = await response.aread()
156126
raise ValueError(f"❌ Error reading response: {error_text.decode()}")
157127

@@ -165,3 +135,80 @@ async def join_conversation(
165135
print("⏰ Request timed out")
166136
except Exception as e:
167137
print(f"❌ Unexpected error: {e}")
138+
139+
# Space APIs
140+
def get_spaces(
141+
self,
142+
limit: Optional[int] = None,
143+
offset: Optional[int] = None,
144+
) -> SpaceListResponse:
145+
response = self.client.request(
146+
method="GET",
147+
endpoint="/spaces",
148+
params=build_pagination_params(limit, offset),
149+
)
150+
if response.status_code != 200 and response.status_code != 201:
151+
raise requests.HTTPError(response=response)
152+
return SpaceListResponse(**response.json())
153+
154+
async def get_spaces_async(
155+
self,
156+
limit: Optional[int] = None,
157+
offset: Optional[int] = None,
158+
) -> SpaceListResponse:
159+
response = await self.client.async_request(
160+
method="GET",
161+
endpoint="/spaces",
162+
params=build_pagination_params(limit, offset),
163+
)
164+
if response.status_code != 200 and response.status_code != 201:
165+
raise requests.HTTPError(response=response)
166+
return SpaceListResponse(**response.json())
167+
168+
def get_space_by_id(
169+
self,
170+
space_id: str,
171+
) -> SpaceDetailResponse:
172+
response = self.client.request(
173+
method="GET",
174+
endpoint=f"/spaces/{space_id}",
175+
)
176+
if response.status_code != 200 and response.status_code != 201:
177+
raise requests.HTTPError(response=response)
178+
return SpaceDetailResponse(**response.json())
179+
180+
async def get_space_by_id_async(
181+
self,
182+
space_id: str,
183+
) -> SpaceDetailResponse:
184+
response = await self.client.async_request(
185+
method="GET",
186+
endpoint=f"/spaces/{space_id}",
187+
)
188+
if response.status_code != 200 and response.status_code != 201:
189+
raise requests.HTTPError(response=response)
190+
return SpaceDetailResponse(**response.json())
191+
192+
def get_space_sections(
193+
self,
194+
space_id: str,
195+
) -> SpaceSectionsResponse:
196+
response = self.client.request(
197+
method="GET",
198+
endpoint=f"/spaces/{space_id}/sections",
199+
)
200+
if response.status_code != 200 and response.status_code != 201:
201+
raise requests.HTTPError(response=response)
202+
return SpaceSectionsResponse(**response.json())
203+
204+
async def get_space_sections_async(
205+
self,
206+
space_id: str,
207+
) -> SpaceSectionsResponse:
208+
response = await self.client.async_request(
209+
method="GET",
210+
endpoint=f"/spaces/{space_id}/sections",
211+
)
212+
if response.status_code != 200 and response.status_code != 201:
213+
raise requests.HTTPError(response=response)
214+
return SpaceSectionsResponse(**response.json())

thesis_py/api_schema/__init__.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,27 @@
1-
from .conversations import ConversationCreateResponse, CreateNewConversationIntegrationRequest, CreateChatConversationIntegrationRequest, CreateDeepResearchConversationIntegrationRequest, JoinConversationIntegrationRequest, ConversationDetailResponse, ResearchMode
1+
from .conversations import (
2+
ConversationCreateResponse,
3+
CreateNewConversationIntegrationRequest,
4+
CreateChatConversationIntegrationRequest,
5+
CreateDeepResearchConversationIntegrationRequest,
6+
JoinConversationIntegrationRequest,
7+
ConversationDetailResponse,
8+
ResearchMode,
9+
)
10+
from .spaces import (
11+
SpaceListResponse,
12+
SpaceDetailResponse,
13+
Space,
14+
User,
15+
SpaceDetail,
16+
SpaceErrorResponse,
17+
SpaceListItem,
18+
SpaceSection,
19+
SpaceSectionsResponse,
20+
TelegramGroup,
21+
TelegramGroupDetail,
22+
Member,
23+
PaginationInfo,
24+
)
225

326
__all__ = [
427
"ConversationCreateResponse",
@@ -8,4 +31,17 @@
831
"JoinConversationIntegrationRequest",
932
"ConversationDetailResponse",
1033
"ResearchMode",
11-
]
34+
"SpaceListResponse",
35+
"User",
36+
"SpaceDetailResponse",
37+
"Space",
38+
"SpaceErrorResponse",
39+
"SpaceListItem",
40+
"SpaceSection",
41+
"SpaceSectionsResponse",
42+
"TelegramGroup",
43+
"TelegramGroupDetail",
44+
"Member",
45+
"PaginationInfo",
46+
"SpaceDetail",
47+
]

0 commit comments

Comments
 (0)