freeplay 0.3.0a10__tar.gz → 0.3.0a12__tar.gz

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.
Files changed (20) hide show
  1. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/PKG-INFO +2 -1
  2. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/pyproject.toml +1 -1
  3. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/api_support.py +7 -0
  4. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/errors.py +9 -0
  5. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/prompts.py +31 -7
  6. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/sessions.py +3 -0
  7. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/support.py +9 -1
  8. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/LICENSE +0 -0
  9. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/README.md +0 -0
  10. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/__init__.py +0 -0
  11. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/freeplay.py +0 -0
  12. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/freeplay_cli.py +0 -0
  13. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/llm_parameters.py +0 -0
  14. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/model.py +0 -0
  15. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/py.typed +0 -0
  16. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/__init__.py +0 -0
  17. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/customer_feedback.py +0 -0
  18. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/recordings.py +0 -0
  19. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/resources/test_runs.py +0 -0
  20. {freeplay-0.3.0a10 → freeplay-0.3.0a12}/src/freeplay/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: freeplay
3
- Version: 0.3.0a10
3
+ Version: 0.3.0a12
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: FreePlay Engineering
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.8
12
12
  Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
15
16
  Requires-Dist: click (==8.1.7)
16
17
  Requires-Dist: dacite (>=1.8.0,<2.0.0)
17
18
  Requires-Dist: pystache (>=0.6.5,<0.7.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "freeplay"
3
- version = "0.3.0-alpha.10"
3
+ version = "0.3.0-alpha.12"
4
4
  description = ""
5
5
  authors = ["FreePlay Engineering <engineering@freeplay.ai>"]
6
6
  license = "MIT"
@@ -60,6 +60,13 @@ def post_raw(api_key: str, url: str, payload: t.Optional[Dict[str, t.Any]] = Non
60
60
  )
61
61
 
62
62
 
63
+ def delete_raw(api_key: str, url: str) -> Response:
64
+ return requests.delete(
65
+ url=url,
66
+ headers=build_request_header(api_key),
67
+ )
68
+
69
+
63
70
  def get(target_type: t.Type[T], api_key: str, url: str) -> T:
64
71
  response = requests.get(
65
72
  url=url,
@@ -1,4 +1,5 @@
1
1
  from requests import Response
2
+ import warnings
2
3
 
3
4
 
4
5
  class FreeplayError(Exception):
@@ -32,3 +33,11 @@ def freeplay_response_error(message: str, response: Response) -> FreeplayError:
32
33
  return FreeplayClientError(full_message)
33
34
  else:
34
35
  return FreeplayServerError(full_message)
36
+
37
+
38
+ class FreeplayClientWarning(UserWarning):
39
+ pass
40
+
41
+
42
+ def log_freeplay_client_warning(message: str) -> None:
43
+ warnings.warn(message, FreeplayClientWarning)
@@ -5,7 +5,7 @@ from dataclasses import dataclass
5
5
  from pathlib import Path
6
6
  from typing import Dict, Optional, List, cast, Any, Union
7
7
 
8
- from freeplay.errors import FreeplayConfigurationError, FreeplayClientError
8
+ from freeplay.errors import FreeplayConfigurationError, FreeplayClientError, log_freeplay_client_warning
9
9
  from freeplay.llm_parameters import LLMParameters
10
10
  from freeplay.model import InputVariables
11
11
  from freeplay.support import CallSupport
@@ -144,11 +144,34 @@ class TemplatePrompt:
144
144
  self.prompt_info = prompt_info
145
145
  self.messages = messages
146
146
 
147
- def bind(self, variables: InputVariables) -> BoundPrompt:
148
- bound_messages = [
149
- {'role': message['role'], 'content': bind_template_variables(message['content'], variables)}
150
- for message in self.messages
151
- ]
147
+ def bind(self, variables: InputVariables, history: Optional[List[Dict[str, str]]] = None) -> BoundPrompt:
148
+ # check history for a system message
149
+ history_clean = []
150
+ if history:
151
+ for msg in history:
152
+ if (msg.get('role') == 'system') & ('system' in [message.get('role') for message in self.messages]):
153
+ log_freeplay_client_warning("System message found in history, and prompt template."
154
+ "Removing system message from the history")
155
+ else:
156
+ history_clean.append(msg)
157
+
158
+ has_history_placeholder = {"kind": "history"} in self.messages
159
+ if history and not has_history_placeholder:
160
+ raise FreeplayClientError(
161
+ "History provided for prompt that does not expect history")
162
+ if has_history_placeholder and not history:
163
+ log_freeplay_client_warning("History missing for prompt that expects history")
164
+
165
+ bound_messages = []
166
+ for msg in self.messages:
167
+ if msg.get('kind') == 'history':
168
+ bound_messages.extend(history_clean)
169
+ else:
170
+ bound_messages.append({
171
+ 'role': msg['role'],
172
+ 'content': bind_template_variables(msg['content'], variables)},
173
+ )
174
+
152
175
  return BoundPrompt(self.prompt_info, bound_messages)
153
176
 
154
177
 
@@ -425,13 +448,14 @@ class Prompts:
425
448
  template_name: str,
426
449
  environment: str,
427
450
  variables: InputVariables,
451
+ history: Optional[List[Dict[str, str]]] = None,
428
452
  flavor_name: Optional[str] = None
429
453
  ) -> FormattedPrompt:
430
454
  bound_prompt = self.get(
431
455
  project_id=project_id,
432
456
  template_name=template_name,
433
457
  environment=environment
434
- ).bind(variables=variables)
458
+ ).bind(variables=variables, history=history)
435
459
 
436
460
  return bound_prompt.format(flavor_name)
437
461
 
@@ -81,6 +81,9 @@ class Sessions:
81
81
  _call_support=self.call_support,
82
82
  )
83
83
 
84
+ def delete(self, project_id: str, session_id: str) -> None:
85
+ self.call_support.delete_session(project_id, session_id)
86
+
84
87
  def restore_session(self, session_id: str, custom_metadata: CustomMetadata = None) -> Session:
85
88
  return Session(
86
89
  session_id=session_id,
@@ -198,7 +198,7 @@ class CallSupport:
198
198
  api_key=self.freeplay_api_key,
199
199
  url=f'{self.api_base}/v2/projects/{project_id}/test-runs/id/{test_run_id}'
200
200
  )
201
- if response.status_code != 201:
201
+ if response.status_code != 200:
202
202
  raise freeplay_response_error('Error while retrieving test run results.', response)
203
203
 
204
204
  json_dom = response.json()
@@ -222,3 +222,11 @@ class CallSupport:
222
222
  if response.status_code != 201:
223
223
  raise freeplay_response_error('Error while recording trace.', response)
224
224
 
225
+ def delete_session(self, project_id: str, session_id: str) -> None:
226
+ response = api_support.delete_raw(
227
+ self.freeplay_api_key,
228
+ f'{self.api_base}/v2/projects/{project_id}/sessions/{session_id}'
229
+ )
230
+ if response.status_code != 201:
231
+ raise freeplay_response_error('Error while deleting session.', response)
232
+
File without changes
File without changes