freeplay 0.3.0a9__tar.gz → 0.3.0a11__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 (21) hide show
  1. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/PKG-INFO +1 -1
  2. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/pyproject.toml +1 -1
  3. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/__init__.py +2 -1
  4. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/api_support.py +7 -0
  5. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/freeplay.py +1 -1
  6. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/resources/recordings.py +7 -1
  7. freeplay-0.3.0a11/src/freeplay/resources/sessions.py +92 -0
  8. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/support.py +22 -2
  9. freeplay-0.3.0a9/src/freeplay/resources/sessions.py +0 -32
  10. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/LICENSE +0 -0
  11. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/README.md +0 -0
  12. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/errors.py +0 -0
  13. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/freeplay_cli.py +0 -0
  14. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/llm_parameters.py +0 -0
  15. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/model.py +0 -0
  16. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/py.typed +0 -0
  17. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/resources/__init__.py +0 -0
  18. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/resources/customer_feedback.py +0 -0
  19. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/resources/prompts.py +0 -0
  20. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/resources/test_runs.py +0 -0
  21. {freeplay-0.3.0a9 → freeplay-0.3.0a11}/src/freeplay/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: freeplay
3
- Version: 0.3.0a9
3
+ Version: 0.3.0a11
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: FreePlay Engineering
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "freeplay"
3
- version = "0.3.0-alpha.9"
3
+ version = "0.3.0-alpha.11"
4
4
  description = ""
5
5
  authors = ["FreePlay Engineering <engineering@freeplay.ai>"]
6
6
  license = "MIT"
@@ -1,7 +1,7 @@
1
1
  from .freeplay import Freeplay
2
2
  from .resources.prompts import PromptInfo
3
3
  from .resources.recordings import CallInfo, ResponseInfo, RecordPayload, TestRunInfo
4
- from .resources.sessions import SessionInfo
4
+ from .resources.sessions import SessionInfo, TraceInfo
5
5
 
6
6
  __all__ = [
7
7
  'CallInfo',
@@ -11,4 +11,5 @@ __all__ = [
11
11
  'ResponseInfo',
12
12
  'SessionInfo',
13
13
  'TestRunInfo',
14
+ 'TraceInfo',
14
15
  ]
@@ -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,
@@ -36,5 +36,5 @@ class Freeplay:
36
36
  self.customer_feedback = CustomerFeedback(self.call_support)
37
37
  self.prompts = Prompts(self.call_support, resolver)
38
38
  self.recordings = Recordings(self.call_support)
39
- self.sessions = Sessions()
39
+ self.sessions = Sessions(self.call_support)
40
40
  self.test_runs = TestRuns(self.call_support)
@@ -10,7 +10,7 @@ from freeplay.errors import FreeplayClientError, FreeplayError
10
10
  from freeplay.llm_parameters import LLMParameters
11
11
  from freeplay.model import InputVariables, OpenAIFunctionCall
12
12
  from freeplay.resources.prompts import PromptInfo
13
- from freeplay.resources.sessions import SessionInfo
13
+ from freeplay.resources.sessions import SessionInfo, TraceInfo
14
14
  from freeplay.support import CallSupport
15
15
 
16
16
  logger = logging.getLogger(__name__)
@@ -62,6 +62,7 @@ class RecordPayload:
62
62
  response_info: Optional[ResponseInfo] = None
63
63
  test_run_info: Optional[TestRunInfo] = None
64
64
  eval_results: Optional[Dict[str, Union[bool, float]]] = None
65
+ trace_info: Optional[TraceInfo] = None
65
66
 
66
67
 
67
68
  @dataclass
@@ -117,6 +118,11 @@ class Recordings:
117
118
  if record_payload.eval_results is not None:
118
119
  record_api_payload['eval_results'] = record_payload.eval_results
119
120
 
121
+ if record_payload.trace_info is not None:
122
+ record_api_payload['trace_info'] = {
123
+ "trace_id": record_payload.trace_info.trace_id
124
+ }
125
+
120
126
  try:
121
127
  recorded_response = api_support.post_raw(
122
128
  api_key=self.call_support.freeplay_api_key,
@@ -0,0 +1,92 @@
1
+ import uuid
2
+ from dataclasses import dataclass
3
+ from typing import Optional, Dict, Union
4
+
5
+ from freeplay.errors import FreeplayClientError
6
+ from freeplay.support import CallSupport
7
+
8
+ CustomMetadata = Optional[Dict[str, Union[str, int, float]]]
9
+
10
+
11
+ @dataclass
12
+ class SessionInfo:
13
+ session_id: str
14
+ custom_metadata: CustomMetadata
15
+
16
+
17
+ class TraceInfo:
18
+ session_id: str
19
+ trace_id: str
20
+ input: Optional[str] = None
21
+ _call_support: CallSupport
22
+
23
+ def __init__(
24
+ self,
25
+ trace_id: str,
26
+ session_id: str,
27
+ _call_support: CallSupport,
28
+ input: Optional[str] = None,
29
+ ):
30
+ self.trace_id = trace_id
31
+ self.session_id = session_id
32
+ self.input = input
33
+ self._call_support = _call_support
34
+
35
+ def record_output(self, project_id: str, output: str) -> None:
36
+ if self.input is None:
37
+ raise FreeplayClientError("Input must be set before recording output")
38
+ self._call_support.record_trace(project_id, self.session_id, self.trace_id, self.input, output)
39
+
40
+
41
+ @dataclass
42
+ class Session:
43
+ session_id: str
44
+ custom_metadata: CustomMetadata
45
+
46
+ def __init__(self, session_id: str, custom_metadata: CustomMetadata, _call_support: CallSupport):
47
+ self.session_id = session_id
48
+ self.custom_metadata = custom_metadata
49
+ self._session_info = SessionInfo(self.session_id, self.custom_metadata)
50
+ self._call_support = _call_support
51
+
52
+ @property
53
+ def session_info(self) -> SessionInfo:
54
+ return self._session_info
55
+
56
+ def create_trace(self, input: str) -> TraceInfo:
57
+ return TraceInfo(
58
+ trace_id=str(uuid.uuid4()),
59
+ session_id=self.session_id,
60
+ input=input,
61
+ _call_support=self._call_support
62
+ )
63
+
64
+ def restore_trace(self, trace_id: uuid.UUID, input: Optional[str]) -> TraceInfo:
65
+ return TraceInfo(
66
+ trace_id=str(trace_id),
67
+ session_id=self.session_id,
68
+ input=input,
69
+ _call_support=self._call_support
70
+ )
71
+
72
+
73
+ class Sessions:
74
+ def __init__(self, call_support: CallSupport):
75
+ self.call_support = call_support
76
+
77
+ def create(self, custom_metadata: CustomMetadata = None) -> Session:
78
+ return Session(
79
+ session_id=str(uuid.uuid4()),
80
+ custom_metadata=custom_metadata,
81
+ _call_support=self.call_support,
82
+ )
83
+
84
+ def delete(self, project_id: str, session_id: str) -> None:
85
+ self.call_support.delete_session(project_id, session_id)
86
+
87
+ def restore_session(self, session_id: str, custom_metadata: CustomMetadata = None) -> Session:
88
+ return Session(
89
+ session_id=session_id,
90
+ custom_metadata=custom_metadata,
91
+ _call_support=self.call_support,
92
+ )
@@ -177,8 +177,8 @@ class CallSupport:
177
177
  payload={
178
178
  'dataset_name': testlist,
179
179
  'include_test_case_outputs': include_test_case_outputs,
180
- 'name': name,
181
- 'description': description
180
+ 'test_run_name': name,
181
+ 'test_run_description': description
182
182
  },
183
183
  )
184
184
 
@@ -210,3 +210,23 @@ class CallSupport:
210
210
  summary_statistics=json_dom['summary_statistics']
211
211
  )
212
212
 
213
+ def record_trace(self, project_id: str, session_id: str, trace_id: str, input: str, output: str) -> None:
214
+ response = api_support.post_raw(
215
+ self.freeplay_api_key,
216
+ f'{self.api_base}/v2/projects/{project_id}/sessions/{session_id}/traces/id/{trace_id}',
217
+ {
218
+ 'input': input,
219
+ 'output': output
220
+ }
221
+ )
222
+ if response.status_code != 201:
223
+ raise freeplay_response_error('Error while recording trace.', response)
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
+
@@ -1,32 +0,0 @@
1
- import uuid
2
- from dataclasses import dataclass
3
- from typing import Optional, Dict, Union
4
-
5
- CustomMetadata = Optional[Dict[str, Union[str, int, float]]]
6
-
7
-
8
- @dataclass
9
- class SessionInfo:
10
- session_id: str
11
- custom_metadata: CustomMetadata
12
-
13
-
14
- @dataclass
15
- class Session:
16
- session_id: str
17
- custom_metadata: CustomMetadata
18
-
19
- def __init__(self, session_id: str, custom_metadata: CustomMetadata):
20
- self.session_id = session_id
21
- self.custom_metadata = custom_metadata
22
- self._session_info = SessionInfo(self.session_id, self.custom_metadata)
23
-
24
- @property
25
- def session_info(self) -> SessionInfo:
26
- return self._session_info
27
-
28
-
29
- class Sessions:
30
- # noinspection PyMethodMayBeStatic
31
- def create(self, custom_metadata: CustomMetadata = None) -> Session:
32
- return Session(session_id=str(uuid.uuid4()), custom_metadata=custom_metadata)
File without changes
File without changes