arize-phoenix 12.7.1__py3-none-any.whl → 12.9.0__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 arize-phoenix might be problematic. Click here for more details.

Files changed (76) hide show
  1. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/METADATA +3 -1
  2. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/RECORD +76 -73
  3. phoenix/config.py +131 -9
  4. phoenix/db/engines.py +127 -14
  5. phoenix/db/iam_auth.py +64 -0
  6. phoenix/db/pg_config.py +10 -0
  7. phoenix/server/api/context.py +23 -0
  8. phoenix/server/api/dataloaders/__init__.py +6 -0
  9. phoenix/server/api/dataloaders/experiment_repeated_run_groups.py +0 -2
  10. phoenix/server/api/dataloaders/experiment_runs_by_experiment_and_example.py +44 -0
  11. phoenix/server/api/dataloaders/span_costs.py +3 -9
  12. phoenix/server/api/dataloaders/token_prices_by_model.py +30 -0
  13. phoenix/server/api/helpers/playground_clients.py +3 -3
  14. phoenix/server/api/input_types/PromptVersionInput.py +47 -1
  15. phoenix/server/api/mutations/annotation_config_mutations.py +2 -2
  16. phoenix/server/api/mutations/api_key_mutations.py +2 -15
  17. phoenix/server/api/mutations/chat_mutations.py +3 -2
  18. phoenix/server/api/mutations/dataset_label_mutations.py +109 -157
  19. phoenix/server/api/mutations/dataset_mutations.py +8 -8
  20. phoenix/server/api/mutations/dataset_split_mutations.py +13 -9
  21. phoenix/server/api/mutations/model_mutations.py +4 -4
  22. phoenix/server/api/mutations/project_session_annotations_mutations.py +4 -7
  23. phoenix/server/api/mutations/prompt_label_mutations.py +3 -3
  24. phoenix/server/api/mutations/prompt_mutations.py +24 -117
  25. phoenix/server/api/mutations/prompt_version_tag_mutations.py +8 -5
  26. phoenix/server/api/mutations/span_annotations_mutations.py +10 -5
  27. phoenix/server/api/mutations/trace_annotations_mutations.py +9 -4
  28. phoenix/server/api/mutations/user_mutations.py +4 -4
  29. phoenix/server/api/queries.py +80 -213
  30. phoenix/server/api/subscriptions.py +4 -4
  31. phoenix/server/api/types/Annotation.py +90 -23
  32. phoenix/server/api/types/ApiKey.py +13 -17
  33. phoenix/server/api/types/Dataset.py +88 -48
  34. phoenix/server/api/types/DatasetExample.py +34 -30
  35. phoenix/server/api/types/DatasetLabel.py +47 -13
  36. phoenix/server/api/types/DatasetSplit.py +87 -21
  37. phoenix/server/api/types/DatasetVersion.py +49 -4
  38. phoenix/server/api/types/DocumentAnnotation.py +182 -62
  39. phoenix/server/api/types/Experiment.py +146 -55
  40. phoenix/server/api/types/ExperimentRepeatedRunGroup.py +10 -1
  41. phoenix/server/api/types/ExperimentRun.py +118 -61
  42. phoenix/server/api/types/ExperimentRunAnnotation.py +158 -39
  43. phoenix/server/api/types/GenerativeModel.py +95 -42
  44. phoenix/server/api/types/ModelInterface.py +7 -2
  45. phoenix/server/api/types/PlaygroundModel.py +12 -2
  46. phoenix/server/api/types/Project.py +70 -75
  47. phoenix/server/api/types/ProjectSession.py +69 -37
  48. phoenix/server/api/types/ProjectSessionAnnotation.py +166 -47
  49. phoenix/server/api/types/ProjectTraceRetentionPolicy.py +1 -1
  50. phoenix/server/api/types/Prompt.py +82 -44
  51. phoenix/server/api/types/PromptLabel.py +47 -13
  52. phoenix/server/api/types/PromptVersion.py +11 -8
  53. phoenix/server/api/types/PromptVersionTag.py +65 -25
  54. phoenix/server/api/types/Span.py +116 -115
  55. phoenix/server/api/types/SpanAnnotation.py +189 -42
  56. phoenix/server/api/types/SystemApiKey.py +65 -1
  57. phoenix/server/api/types/Trace.py +45 -44
  58. phoenix/server/api/types/TraceAnnotation.py +144 -48
  59. phoenix/server/api/types/User.py +103 -33
  60. phoenix/server/api/types/UserApiKey.py +73 -26
  61. phoenix/server/app.py +29 -0
  62. phoenix/server/cost_tracking/model_cost_manifest.json +2 -2
  63. phoenix/server/static/.vite/manifest.json +43 -43
  64. phoenix/server/static/assets/{components-BLK5vehh.js → components-v927s3NF.js} +471 -484
  65. phoenix/server/static/assets/{index-BP0Shd90.js → index-DrD9eSrN.js} +20 -16
  66. phoenix/server/static/assets/{pages-DIVgyYyy.js → pages-GVybXa_W.js} +754 -753
  67. phoenix/server/static/assets/{vendor-3BvTzoBp.js → vendor-D-csRHGZ.js} +1 -1
  68. phoenix/server/static/assets/{vendor-arizeai-C6_oC0y8.js → vendor-arizeai-BJLCG_Gc.js} +1 -1
  69. phoenix/server/static/assets/{vendor-codemirror-DPnZGAZA.js → vendor-codemirror-Cr963DyP.js} +3 -3
  70. phoenix/server/static/assets/{vendor-recharts-CjgSbsB0.js → vendor-recharts-DgmPLgIp.js} +1 -1
  71. phoenix/server/static/assets/{vendor-shiki-CJyhDG0E.js → vendor-shiki-wYOt1s7u.js} +1 -1
  72. phoenix/version.py +1 -1
  73. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/WHEEL +0 -0
  74. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/entry_points.txt +0 -0
  75. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/licenses/IP_NOTICE +0 -0
  76. {arize_phoenix-12.7.1.dist-info → arize_phoenix-12.9.0.dist-info}/licenses/LICENSE +0 -0
@@ -2,23 +2,57 @@ from typing import Optional
2
2
 
3
3
  import strawberry
4
4
  from strawberry.relay import Node, NodeID
5
+ from strawberry.types import Info
5
6
 
6
7
  from phoenix.db import models
8
+ from phoenix.server.api.context import Context
7
9
  from phoenix.server.api.types.Identifier import Identifier
8
10
 
9
11
 
10
12
  @strawberry.type
11
13
  class PromptLabel(Node):
12
- id_attr: NodeID[int]
13
- name: Identifier
14
- description: Optional[str] = None
15
- color: str
16
-
17
-
18
- def to_gql_prompt_label(label_orm: models.PromptLabel) -> PromptLabel:
19
- return PromptLabel(
20
- id_attr=label_orm.id,
21
- name=Identifier(label_orm.name),
22
- description=label_orm.description,
23
- color=label_orm.color,
24
- )
14
+ id: NodeID[int]
15
+ db_record: strawberry.Private[Optional[models.PromptLabel]] = None
16
+
17
+ def __post_init__(self) -> None:
18
+ if self.db_record and self.id != self.db_record.id:
19
+ raise ValueError("PromptLabel ID mismatch")
20
+
21
+ @strawberry.field
22
+ async def name(
23
+ self,
24
+ info: Info[Context, None],
25
+ ) -> Identifier:
26
+ if self.db_record:
27
+ val = self.db_record.name
28
+ else:
29
+ val = await info.context.data_loaders.prompt_label_fields.load(
30
+ (self.id, models.PromptLabel.name),
31
+ )
32
+ return Identifier(val)
33
+
34
+ @strawberry.field
35
+ async def description(
36
+ self,
37
+ info: Info[Context, None],
38
+ ) -> Optional[str]:
39
+ if self.db_record:
40
+ val = self.db_record.description
41
+ else:
42
+ val = await info.context.data_loaders.prompt_label_fields.load(
43
+ (self.id, models.PromptLabel.description),
44
+ )
45
+ return val
46
+
47
+ @strawberry.field
48
+ async def color(
49
+ self,
50
+ info: Info[Context, None],
51
+ ) -> str:
52
+ if self.db_record:
53
+ val = self.db_record.color
54
+ else:
55
+ val = await info.context.data_loaders.prompt_label_fields.load(
56
+ (self.id, models.PromptLabel.color),
57
+ )
58
+ return val
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Optional
2
+ from typing import TYPE_CHECKING, Annotated, Optional
3
3
 
4
4
  import strawberry
5
5
  from sqlalchemy import select
@@ -18,7 +18,7 @@ from phoenix.server.api.helpers.prompts.models import (
18
18
  denormalize_tools,
19
19
  get_raw_invocation_parameters,
20
20
  )
21
- from phoenix.server.api.types.PromptVersionTag import PromptVersionTag, to_gql_prompt_version_tag
21
+ from phoenix.server.api.types.PromptVersionTag import PromptVersionTag
22
22
  from phoenix.server.api.types.PromptVersionTemplate import (
23
23
  PromptTemplate,
24
24
  to_gql_template_from_orm,
@@ -26,7 +26,9 @@ from phoenix.server.api.types.PromptVersionTemplate import (
26
26
 
27
27
  from .ResponseFormat import ResponseFormat
28
28
  from .ToolDefinition import ToolDefinition
29
- from .User import User, to_gql_user
29
+
30
+ if TYPE_CHECKING:
31
+ from .User import User
30
32
 
31
33
 
32
34
  @strawberry.type
@@ -53,16 +55,17 @@ class PromptVersion(Node):
53
55
  models.PromptVersionTag.prompt_version_id == self.id_attr
54
56
  )
55
57
  return [
56
- to_gql_prompt_version_tag(tag) async for tag in await session.stream_scalars(stmt)
58
+ PromptVersionTag(id=tag.id, db_record=tag)
59
+ async for tag in await session.stream_scalars(stmt)
57
60
  ]
58
61
 
59
62
  @strawberry.field
60
- async def user(self, info: Info[Context, None]) -> Optional[User]:
63
+ async def user(self) -> Optional[Annotated["User", strawberry.lazy(".User")]]:
61
64
  if self.user_id is None:
62
65
  return None
63
- async with info.context.db() as session:
64
- user = await session.get(models.User, self.user_id)
65
- return to_gql_user(user) if user is not None else None
66
+ from .User import User
67
+
68
+ return User(id=self.user_id)
66
69
 
67
70
  @strawberry.field
68
71
  async def previous_version(self, info: Info[Context, None]) -> Optional["PromptVersion"]:
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from typing import TYPE_CHECKING, Annotated, Optional
2
2
 
3
3
  import strawberry
4
4
  from strawberry import Info
@@ -7,34 +7,74 @@ from strawberry.relay import GlobalID, Node, NodeID
7
7
  from phoenix.db import models
8
8
  from phoenix.server.api.context import Context
9
9
  from phoenix.server.api.types.Identifier import Identifier
10
- from phoenix.server.api.types.User import User, to_gql_user
10
+ from phoenix.server.api.types.User import User
11
+
12
+ if TYPE_CHECKING:
13
+ from .User import User
11
14
 
12
15
 
13
16
  @strawberry.type
14
17
  class PromptVersionTag(Node):
15
- id_attr: NodeID[int]
16
- user_id: strawberry.Private[Optional[int]]
17
- prompt_version_id: GlobalID
18
- name: Identifier
19
- description: Optional[str] = None
18
+ id: NodeID[int]
19
+ db_record: strawberry.Private[Optional[models.PromptVersionTag]] = None
20
+
21
+ def __post_init__(self) -> None:
22
+ if self.db_record and self.id != self.db_record.id:
23
+ raise ValueError("PromptVersionTag ID mismatch")
24
+
25
+ @strawberry.field
26
+ async def prompt_version_id(
27
+ self,
28
+ info: Info[Context, None],
29
+ ) -> GlobalID:
30
+ from phoenix.server.api.types.PromptVersion import PromptVersion
31
+
32
+ if self.db_record:
33
+ version_id = self.db_record.prompt_version_id
34
+ else:
35
+ version_id = await info.context.data_loaders.prompt_version_tag_fields.load(
36
+ (self.id, models.PromptVersionTag.prompt_version_id),
37
+ )
38
+ return GlobalID(PromptVersion.__name__, str(version_id))
20
39
 
21
40
  @strawberry.field
22
- async def user(self, info: Info[Context, None]) -> Optional[User]:
23
- if self.user_id is None:
41
+ async def name(
42
+ self,
43
+ info: Info[Context, None],
44
+ ) -> Identifier:
45
+ if self.db_record:
46
+ val = self.db_record.name
47
+ else:
48
+ val = await info.context.data_loaders.prompt_version_tag_fields.load(
49
+ (self.id, models.PromptVersionTag.name),
50
+ )
51
+ return Identifier(val.root)
52
+
53
+ @strawberry.field
54
+ async def description(
55
+ self,
56
+ info: Info[Context, None],
57
+ ) -> Optional[str]:
58
+ if self.db_record:
59
+ val = self.db_record.description
60
+ else:
61
+ val = await info.context.data_loaders.prompt_version_tag_fields.load(
62
+ (self.id, models.PromptVersionTag.description),
63
+ )
64
+ return val
65
+
66
+ @strawberry.field
67
+ async def user(
68
+ self, info: Info[Context, None]
69
+ ) -> Optional[Annotated["User", strawberry.lazy(".User")]]:
70
+ if self.db_record:
71
+ user_id = self.db_record.user_id
72
+ else:
73
+ user_id = await info.context.data_loaders.prompt_version_tag_fields.load(
74
+ (self.id, models.PromptVersionTag.user_id),
75
+ )
76
+ if user_id is None:
24
77
  return None
25
- async with info.context.db() as session:
26
- user = await session.get(models.User, self.user_id)
27
- return to_gql_user(user) if user is not None else None
28
-
29
-
30
- def to_gql_prompt_version_tag(prompt_version_tag: models.PromptVersionTag) -> PromptVersionTag:
31
- from phoenix.server.api.types.PromptVersion import PromptVersion
32
-
33
- version_gid = GlobalID(PromptVersion.__name__, str(prompt_version_tag.prompt_version_id))
34
- return PromptVersionTag(
35
- id_attr=prompt_version_tag.id,
36
- prompt_version_id=version_gid,
37
- name=Identifier(prompt_version_tag.name.root),
38
- description=prompt_version_tag.description,
39
- user_id=prompt_version_tag.user_id,
40
- )
78
+ from .User import User
79
+
80
+ return User(id=user_id)