simile 0.2.9__py3-none-any.whl → 0.2.10__py3-none-any.whl
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.
Potentially problematic release.
This version of simile might be problematic. Click here for more details.
- simile/client.py +8 -5
- simile/models.py +47 -29
- simile/resources.py +40 -20
- {simile-0.2.9.dist-info → simile-0.2.10.dist-info}/METADATA +1 -1
- simile-0.2.10.dist-info/RECORD +10 -0
- simile-0.2.9.dist-info/RECORD +0 -10
- {simile-0.2.9.dist-info → simile-0.2.10.dist-info}/WHEEL +0 -0
- {simile-0.2.9.dist-info → simile-0.2.10.dist-info}/licenses/LICENSE +0 -0
- {simile-0.2.9.dist-info → simile-0.2.10.dist-info}/top_level.txt +0 -0
simile/client.py
CHANGED
|
@@ -137,7 +137,7 @@ class Simile:
|
|
|
137
137
|
self, session_id: Union[str, uuid.UUID]
|
|
138
138
|
) -> SurveySession:
|
|
139
139
|
"""Resume an existing survey session by ID and return a SurveySession object."""
|
|
140
|
-
session_details = await self.
|
|
140
|
+
session_details = await self.get_survey_session(session_id)
|
|
141
141
|
|
|
142
142
|
if session_details.status == "closed":
|
|
143
143
|
raise ValueError(f"Session {session_id} is already closed")
|
|
@@ -280,11 +280,14 @@ class Simile:
|
|
|
280
280
|
return response_data
|
|
281
281
|
|
|
282
282
|
async def generate_qual_response(
|
|
283
|
-
self,
|
|
283
|
+
self,
|
|
284
|
+
agent_id: uuid.UUID,
|
|
285
|
+
question: str,
|
|
286
|
+
images: Optional[Dict[str, str]] = None,
|
|
284
287
|
) -> QualGenerationResponse:
|
|
285
288
|
"""Generates a qualitative response from an agent based on a question."""
|
|
286
289
|
endpoint = f"/generation/qual/{str(agent_id)}"
|
|
287
|
-
request_payload = QualGenerationRequest(question=question,
|
|
290
|
+
request_payload = QualGenerationRequest(question=question, images=images)
|
|
288
291
|
response_data = await self._request(
|
|
289
292
|
"POST",
|
|
290
293
|
endpoint,
|
|
@@ -298,12 +301,12 @@ class Simile:
|
|
|
298
301
|
agent_id: uuid.UUID,
|
|
299
302
|
question: str,
|
|
300
303
|
options: List[str],
|
|
301
|
-
|
|
304
|
+
images: Optional[Dict[str, str]] = None,
|
|
302
305
|
) -> MCGenerationResponse:
|
|
303
306
|
"""Generates a multiple-choice response from an agent."""
|
|
304
307
|
endpoint = f"generation/mc/{str(agent_id)}"
|
|
305
308
|
request_payload = MCGenerationRequest(
|
|
306
|
-
question=question, options=options,
|
|
309
|
+
question=question, options=options, images=images
|
|
307
310
|
)
|
|
308
311
|
response_data = await self._request(
|
|
309
312
|
"POST",
|
simile/models.py
CHANGED
|
@@ -30,6 +30,7 @@ class Agent(BaseModel):
|
|
|
30
30
|
updated_at: datetime
|
|
31
31
|
data_items: List[DataItem] = Field(default_factory=list)
|
|
32
32
|
|
|
33
|
+
|
|
33
34
|
class CreatePopulationPayload(BaseModel):
|
|
34
35
|
name: str
|
|
35
36
|
description: Optional[str] = None
|
|
@@ -62,26 +63,32 @@ class DeletionResponse(BaseModel):
|
|
|
62
63
|
# --- Generation Operation Models ---
|
|
63
64
|
class QualGenerationRequest(BaseModel):
|
|
64
65
|
question: str
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
images: Optional[Dict[str, str]] = (
|
|
67
|
+
None # Dict of {description: url} for multiple images
|
|
68
|
+
)
|
|
69
|
+
|
|
67
70
|
|
|
68
71
|
class QualGenerationResponse(BaseModel):
|
|
69
72
|
question: str
|
|
70
73
|
answer: str
|
|
71
74
|
|
|
75
|
+
|
|
72
76
|
class MCGenerationRequest(BaseModel):
|
|
73
77
|
question: str
|
|
74
78
|
options: List[str]
|
|
75
|
-
|
|
79
|
+
images: Optional[Dict[str, str]] = None
|
|
80
|
+
|
|
76
81
|
|
|
77
82
|
class MCGenerationResponse(BaseModel):
|
|
78
83
|
question: str
|
|
79
84
|
options: List[str]
|
|
80
85
|
chosen_option: str
|
|
81
86
|
|
|
87
|
+
|
|
82
88
|
class AddContextRequest(BaseModel):
|
|
83
89
|
context: str
|
|
84
90
|
|
|
91
|
+
|
|
85
92
|
class AddContextResponse(BaseModel):
|
|
86
93
|
message: str
|
|
87
94
|
session_id: uuid.UUID
|
|
@@ -90,6 +97,7 @@ class AddContextResponse(BaseModel):
|
|
|
90
97
|
# --- Survey Session Models ---
|
|
91
98
|
class TurnType(str, Enum):
|
|
92
99
|
"""Enum for different types of conversation turns."""
|
|
100
|
+
|
|
93
101
|
CONTEXT = "context"
|
|
94
102
|
IMAGE = "image"
|
|
95
103
|
QUALITATIVE_QUESTION = "qualitative_question"
|
|
@@ -98,101 +106,111 @@ class TurnType(str, Enum):
|
|
|
98
106
|
|
|
99
107
|
class BaseTurn(BaseModel):
|
|
100
108
|
"""Base model for all conversation turns."""
|
|
109
|
+
|
|
101
110
|
timestamp: datetime = Field(default_factory=lambda: datetime.now())
|
|
102
111
|
type: TurnType
|
|
103
|
-
|
|
112
|
+
|
|
104
113
|
class Config:
|
|
105
114
|
use_enum_values = True
|
|
106
115
|
|
|
107
116
|
|
|
108
117
|
class ContextTurn(BaseTurn):
|
|
109
118
|
"""A context turn that provides background information."""
|
|
119
|
+
|
|
110
120
|
type: Literal[TurnType.CONTEXT] = TurnType.CONTEXT
|
|
111
121
|
user_context: str
|
|
112
122
|
|
|
113
123
|
|
|
114
124
|
class ImageTurn(BaseTurn):
|
|
115
125
|
"""A standalone image turn (e.g., for context or reference)."""
|
|
126
|
+
|
|
116
127
|
type: Literal[TurnType.IMAGE] = TurnType.IMAGE
|
|
117
|
-
|
|
128
|
+
images: Dict[str, str]
|
|
118
129
|
caption: Optional[str] = None
|
|
119
130
|
|
|
120
131
|
|
|
121
132
|
class QualitativeQuestionTurn(BaseTurn):
|
|
122
133
|
"""A qualitative question-answer turn."""
|
|
134
|
+
|
|
123
135
|
type: Literal[TurnType.QUALITATIVE_QUESTION] = TurnType.QUALITATIVE_QUESTION
|
|
124
136
|
user_question: str
|
|
125
|
-
|
|
126
|
-
user_images: Optional[Dict[str, str]] = None # Dict of {description: url} for multiple images
|
|
137
|
+
user_images: Optional[Dict[str, str]] = None
|
|
127
138
|
llm_response: Optional[str] = None
|
|
128
139
|
|
|
129
140
|
|
|
130
141
|
class MultipleChoiceQuestionTurn(BaseTurn):
|
|
131
142
|
"""A multiple choice question-answer turn."""
|
|
143
|
+
|
|
132
144
|
type: Literal[TurnType.MULTIPLE_CHOICE_QUESTION] = TurnType.MULTIPLE_CHOICE_QUESTION
|
|
133
145
|
user_question: str
|
|
134
146
|
user_options: List[str]
|
|
135
|
-
|
|
147
|
+
user_images: Optional[Dict[str, str]] = None
|
|
136
148
|
llm_chosen_option: Optional[str] = None
|
|
137
|
-
|
|
138
|
-
@validator(
|
|
149
|
+
|
|
150
|
+
@validator("user_options")
|
|
139
151
|
def validate_options(cls, v):
|
|
140
152
|
if not v:
|
|
141
153
|
raise ValueError("Multiple choice questions must have at least one option")
|
|
142
154
|
if len(v) < 2:
|
|
143
|
-
raise ValueError(
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"Multiple choice questions should have at least two options"
|
|
157
|
+
)
|
|
144
158
|
return v
|
|
145
|
-
|
|
146
|
-
@validator(
|
|
159
|
+
|
|
160
|
+
@validator("llm_chosen_option")
|
|
147
161
|
def validate_chosen_option(cls, v, values):
|
|
148
|
-
if
|
|
162
|
+
if (
|
|
163
|
+
v is not None
|
|
164
|
+
and "user_options" in values
|
|
165
|
+
and v not in values["user_options"]
|
|
166
|
+
):
|
|
149
167
|
raise ValueError(f"Chosen option '{v}' must be one of the provided options")
|
|
150
168
|
return v
|
|
151
169
|
|
|
152
170
|
|
|
153
171
|
# Union type for all possible turn types
|
|
154
|
-
SurveySessionTurn = Union[
|
|
172
|
+
SurveySessionTurn = Union[
|
|
173
|
+
ContextTurn, ImageTurn, QualitativeQuestionTurn, MultipleChoiceQuestionTurn
|
|
174
|
+
]
|
|
155
175
|
|
|
156
176
|
|
|
157
177
|
class SurveySessionCreateResponse(BaseModel):
|
|
158
|
-
id: uuid.UUID
|
|
178
|
+
id: uuid.UUID # Session ID
|
|
159
179
|
agent_id: uuid.UUID
|
|
160
180
|
created_at: datetime
|
|
161
181
|
status: str
|
|
162
|
-
|
|
182
|
+
|
|
163
183
|
|
|
164
184
|
class SurveySessionDetailResponse(BaseModel):
|
|
165
185
|
"""Detailed survey session response with typed conversation turns."""
|
|
186
|
+
|
|
166
187
|
id: uuid.UUID
|
|
167
188
|
agent_id: uuid.UUID
|
|
168
189
|
created_at: datetime
|
|
169
190
|
updated_at: datetime
|
|
170
191
|
status: str
|
|
171
192
|
conversation_history: List[SurveySessionTurn] = Field(default_factory=list)
|
|
172
|
-
|
|
193
|
+
|
|
173
194
|
class Config:
|
|
174
|
-
json_encoders = {
|
|
175
|
-
datetime: lambda v: v.isoformat()
|
|
176
|
-
}
|
|
195
|
+
json_encoders = {datetime: lambda v: v.isoformat()}
|
|
177
196
|
|
|
178
197
|
|
|
179
198
|
class SurveySessionListItemResponse(BaseModel):
|
|
180
199
|
"""Summary response for listing survey sessions."""
|
|
200
|
+
|
|
181
201
|
id: uuid.UUID
|
|
182
202
|
agent_id: uuid.UUID
|
|
183
203
|
created_at: datetime
|
|
184
204
|
updated_at: datetime
|
|
185
205
|
status: str
|
|
186
206
|
turn_count: int = Field(description="Number of turns in conversation history")
|
|
187
|
-
|
|
207
|
+
|
|
188
208
|
class Config:
|
|
189
|
-
json_encoders = {
|
|
190
|
-
datetime: lambda v: v.isoformat()
|
|
191
|
-
}
|
|
209
|
+
json_encoders = {datetime: lambda v: v.isoformat()}
|
|
192
210
|
|
|
193
211
|
|
|
194
212
|
class SurveySessionCloseResponse(BaseModel):
|
|
195
|
-
id: uuid.UUID
|
|
196
|
-
status: str
|
|
197
|
-
updated_at: datetime
|
|
198
|
-
message: Optional[str] = None
|
|
213
|
+
id: uuid.UUID # Session ID
|
|
214
|
+
status: str
|
|
215
|
+
updated_at: datetime
|
|
216
|
+
message: Optional[str] = None
|
simile/resources.py
CHANGED
|
@@ -9,15 +9,17 @@ from .models import (
|
|
|
9
9
|
SurveySessionCloseResponse,
|
|
10
10
|
AddContextRequest,
|
|
11
11
|
AddContextResponse,
|
|
12
|
-
SurveySessionDetailResponse
|
|
12
|
+
SurveySessionDetailResponse,
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
16
|
from .client import Simile
|
|
17
17
|
|
|
18
|
+
|
|
18
19
|
class Agent:
|
|
19
20
|
"""Represents an agent and provides methods for interacting with it directly."""
|
|
20
|
-
|
|
21
|
+
|
|
22
|
+
def __init__(self, agent_id: uuid.UUID, client: "Simile"):
|
|
21
23
|
self._agent_id = agent_id
|
|
22
24
|
self._client = client
|
|
23
25
|
|
|
@@ -25,18 +27,32 @@ class Agent:
|
|
|
25
27
|
def id(self) -> uuid.UUID:
|
|
26
28
|
return self._agent_id
|
|
27
29
|
|
|
28
|
-
async def generate_qual_response(
|
|
30
|
+
async def generate_qual_response(
|
|
31
|
+
self, question: str, images: Optional[Dict[str, str]] = None
|
|
32
|
+
) -> QualGenerationResponse:
|
|
29
33
|
"""Generates a qualitative response from this agent based on a question."""
|
|
30
|
-
return await self._client.generate_qual_response(
|
|
34
|
+
return await self._client.generate_qual_response(
|
|
35
|
+
agent_id=self._agent_id, question=question, images=images
|
|
36
|
+
)
|
|
31
37
|
|
|
32
|
-
async def generate_mc_response(
|
|
38
|
+
async def generate_mc_response(
|
|
39
|
+
self, question: str, options: List[str], images: Optional[Dict[str, str]] = None
|
|
40
|
+
) -> MCGenerationResponse:
|
|
33
41
|
"""Generates a multiple-choice response from this agent."""
|
|
34
|
-
return await self._client.generate_mc_response(
|
|
42
|
+
return await self._client.generate_mc_response(
|
|
43
|
+
agent_id=self._agent_id,
|
|
44
|
+
question=question,
|
|
45
|
+
options=options,
|
|
46
|
+
images=images,
|
|
47
|
+
)
|
|
35
48
|
|
|
36
49
|
|
|
37
50
|
class SurveySession:
|
|
38
51
|
"""Represents an active survey session with an agent, allowing for contextual multi-turn generation."""
|
|
39
|
-
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self, id: uuid.UUID, agent_id: uuid.UUID, status: str, client: "Simile"
|
|
55
|
+
):
|
|
40
56
|
self._id = id
|
|
41
57
|
self._agent_id = agent_id
|
|
42
58
|
self._status = status
|
|
@@ -56,28 +72,34 @@ class SurveySession:
|
|
|
56
72
|
|
|
57
73
|
async def get_details(self) -> SurveySessionDetailResponse:
|
|
58
74
|
"""Retrieves detailed information about this survey session including typed conversation history."""
|
|
59
|
-
return await self._client.
|
|
75
|
+
return await self._client.get_survey_session_details(self._id)
|
|
60
76
|
|
|
61
|
-
async def generate_qual_response(
|
|
77
|
+
async def generate_qual_response(
|
|
78
|
+
self,
|
|
79
|
+
question: str,
|
|
80
|
+
images: Optional[Dict[str, str]] = None,
|
|
81
|
+
) -> QualGenerationResponse:
|
|
62
82
|
"""Generates a qualitative response within this survey session."""
|
|
63
83
|
endpoint = f"sessions/{str(self._id)}/qual"
|
|
64
|
-
payload = QualGenerationRequest(question=question,
|
|
84
|
+
payload = QualGenerationRequest(question=question, images=images)
|
|
65
85
|
return await self._client._request(
|
|
66
86
|
"POST",
|
|
67
87
|
endpoint,
|
|
68
|
-
json=payload.model_dump(),
|
|
69
|
-
response_model=QualGenerationResponse
|
|
88
|
+
json=payload.model_dump(),
|
|
89
|
+
response_model=QualGenerationResponse,
|
|
70
90
|
)
|
|
71
91
|
|
|
72
|
-
async def generate_mc_response(
|
|
92
|
+
async def generate_mc_response(
|
|
93
|
+
self, question: str, options: List[str], images: Optional[Dict[str, str]] = None
|
|
94
|
+
) -> MCGenerationResponse:
|
|
73
95
|
"""Generates a multiple-choice response within this survey session."""
|
|
74
96
|
endpoint = f"sessions/{str(self._id)}/mc"
|
|
75
|
-
payload = MCGenerationRequest(question=question, options=options,
|
|
97
|
+
payload = MCGenerationRequest(question=question, options=options, images=images)
|
|
76
98
|
return await self._client._request(
|
|
77
99
|
"POST",
|
|
78
100
|
endpoint,
|
|
79
|
-
json=payload.model_dump(),
|
|
80
|
-
response_model=MCGenerationResponse
|
|
101
|
+
json=payload.model_dump(),
|
|
102
|
+
response_model=MCGenerationResponse,
|
|
81
103
|
)
|
|
82
104
|
|
|
83
105
|
async def add_context(self, ctx: str) -> AddContextResponse:
|
|
@@ -88,14 +110,12 @@ class SurveySession:
|
|
|
88
110
|
"POST",
|
|
89
111
|
endpoint,
|
|
90
112
|
json=payload.model_dump(),
|
|
91
|
-
response_model=AddContextResponse
|
|
113
|
+
response_model=AddContextResponse,
|
|
92
114
|
)
|
|
93
115
|
|
|
94
116
|
async def close(self) -> SurveySessionCloseResponse:
|
|
95
117
|
"""Closes this survey session on the server."""
|
|
96
118
|
endpoint = f"sessions/{str(self._id)}/close"
|
|
97
119
|
return await self._client._request(
|
|
98
|
-
"POST",
|
|
99
|
-
endpoint,
|
|
100
|
-
response_model=SurveySessionCloseResponse
|
|
120
|
+
"POST", endpoint, response_model=SurveySessionCloseResponse
|
|
101
121
|
)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
simile/__init__.py,sha256=2OZ1LQIkAEtSs0EI5Fzlg7QGKduCgCe_nTh9FfIuHlQ,865
|
|
2
|
+
simile/client.py,sha256=C7ZA9UAYjOKT5jc1nzO3JOgPwq0GK8gp12xE3ToN-0A,11855
|
|
3
|
+
simile/exceptions.py,sha256=-rJ3KZcpvNRi9JXbDpxWDSL2lU1mEJX2piwYRZvhKmg,1406
|
|
4
|
+
simile/models.py,sha256=1o28eOo53dZCrSSWT2myM4WOghyBhStBm2KRHBxX_Ho,5260
|
|
5
|
+
simile/resources.py,sha256=Mt0TvipiseVtkiB7kLssAa1m4JVIrtmXG6rFd7HXHkM,4089
|
|
6
|
+
simile-0.2.10.dist-info/licenses/LICENSE,sha256=tpxX3bpODfyOQVyEM6kCMvPHFCpkjFDj0AICRqKqOFA,1066
|
|
7
|
+
simile-0.2.10.dist-info/METADATA,sha256=pGJJK0dcFMikY6jat6hGYsO_3SkBUp8x1dqNcfeRiio,1277
|
|
8
|
+
simile-0.2.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
+
simile-0.2.10.dist-info/top_level.txt,sha256=41lJneubAG4-ZOAs5qn7iDtDb-MDxa6DdvgBKwNX84M,7
|
|
10
|
+
simile-0.2.10.dist-info/RECORD,,
|
simile-0.2.9.dist-info/RECORD
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
simile/__init__.py,sha256=2OZ1LQIkAEtSs0EI5Fzlg7QGKduCgCe_nTh9FfIuHlQ,865
|
|
2
|
-
simile/client.py,sha256=UvheMza-03UJf-hTOMDEDzcuexq2kWd3nD8mqw2V0tY,11834
|
|
3
|
-
simile/exceptions.py,sha256=-rJ3KZcpvNRi9JXbDpxWDSL2lU1mEJX2piwYRZvhKmg,1406
|
|
4
|
-
simile/models.py,sha256=gM6QqVySJe6sG-X7deDcpQYo0JMhfxtfZtBHFP-ZqSI,5376
|
|
5
|
-
simile/resources.py,sha256=KPSmcX6cgVfOCPvL1eD5zc9fvOw5n4oe6pOieuzp8zg,3982
|
|
6
|
-
simile-0.2.9.dist-info/licenses/LICENSE,sha256=tpxX3bpODfyOQVyEM6kCMvPHFCpkjFDj0AICRqKqOFA,1066
|
|
7
|
-
simile-0.2.9.dist-info/METADATA,sha256=DCAjpe8YeVui8WbavtdtZFRuawtljXv3_xV4o3RR51Y,1276
|
|
8
|
-
simile-0.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
-
simile-0.2.9.dist-info/top_level.txt,sha256=41lJneubAG4-ZOAs5qn7iDtDb-MDxa6DdvgBKwNX84M,7
|
|
10
|
-
simile-0.2.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|