simile 0.2.8__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 CHANGED
@@ -280,11 +280,14 @@ class Simile:
280
280
  return response_data
281
281
 
282
282
  async def generate_qual_response(
283
- self, agent_id: uuid.UUID, question: str, image_url: Optional[str] = None
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, image_url=image_url)
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
- image_url: Optional[str] = None,
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, image_url=image_url
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
- image_url: Optional[str] = None # For backward compatibility
66
- images: Optional[Dict[str, str]] = None # Dict of {description: url} for multiple images
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
- image_url: Optional[str] = None
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
- image_url: str
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
- user_image_url: Optional[str] = None # For backward compatibility
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
- user_image_url: Optional[str] = None
147
+ user_images: Optional[Dict[str, str]] = None
136
148
  llm_chosen_option: Optional[str] = None
137
-
138
- @validator('user_options')
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("Multiple choice questions should have at least two options")
155
+ raise ValueError(
156
+ "Multiple choice questions should have at least two options"
157
+ )
144
158
  return v
145
-
146
- @validator('llm_chosen_option')
159
+
160
+ @validator("llm_chosen_option")
147
161
  def validate_chosen_option(cls, v, values):
148
- if v is not None and 'user_options' in values and v not in values['user_options']:
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[ContextTurn, ImageTurn, QualitativeQuestionTurn, MultipleChoiceQuestionTurn]
172
+ SurveySessionTurn = Union[
173
+ ContextTurn, ImageTurn, QualitativeQuestionTurn, MultipleChoiceQuestionTurn
174
+ ]
155
175
 
156
176
 
157
177
  class SurveySessionCreateResponse(BaseModel):
158
- id: uuid.UUID # Session ID
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 # Session ID
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
- def __init__(self, agent_id: uuid.UUID, client: 'Simile'):
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(self, question: str, image_url: Optional[str] = None) -> QualGenerationResponse:
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(agent_id=self._agent_id, question=question, image_url=image_url)
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(self, question: str, options: List[str], image_url: Optional[str] = None) -> MCGenerationResponse:
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(agent_id=self._agent_id, question=question, options=options, image_url=image_url)
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
- def __init__(self, id: uuid.UUID, agent_id: uuid.UUID, status: str, client: 'Simile'):
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.get_survey_session(self._id)
75
+ return await self._client.get_survey_session_details(self._id)
60
76
 
61
- async def generate_qual_response(self, question: str, image_url: Optional[str] = None, images: Optional[Dict[str, str]] = None) -> QualGenerationResponse:
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, image_url=image_url, images=images)
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(self, question: str, options: List[str], image_url: Optional[str] = None) -> MCGenerationResponse:
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, image_url=image_url)
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
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simile
3
- Version: 0.2.8
3
+ Version: 0.2.10
4
4
  Summary: Package for interfacing with Simile AI agents for simulation
5
5
  Author-email: Simile AI <cqz@simile.ai>
6
6
  License: MIT
@@ -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,,
@@ -1,10 +0,0 @@
1
- simile/__init__.py,sha256=2OZ1LQIkAEtSs0EI5Fzlg7QGKduCgCe_nTh9FfIuHlQ,865
2
- simile/client.py,sha256=6gtzniCdx4bfpseO448ViZa0CGz1CdQDPGXM3VBaRyg,11826
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.8.dist-info/licenses/LICENSE,sha256=tpxX3bpODfyOQVyEM6kCMvPHFCpkjFDj0AICRqKqOFA,1066
7
- simile-0.2.8.dist-info/METADATA,sha256=xic3erPzu6K041_zHaHDM8na8HkHGPIRKBcUsf4mH_g,1276
8
- simile-0.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- simile-0.2.8.dist-info/top_level.txt,sha256=41lJneubAG4-ZOAs5qn7iDtDb-MDxa6DdvgBKwNX84M,7
10
- simile-0.2.8.dist-info/RECORD,,