From b94c0c5b6922d44273c003b49133403605f82160 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Tue, 23 Apr 2024 12:28:47 -0600 Subject: [PATCH 1/2] feat: add gradient start/end to projects table --- app/schema.graphql | 2 ++ app/src/pages/projects/ProjectsPage.tsx | 28 +++++++++++++++---- .../ProjectsPageProjectsFragment.graphql.ts | 20 +++++++++++-- .../ProjectsPageProjectsQuery.graphql.ts | 22 ++++++++++++--- .../ProjectsPageQuery.graphql.ts | 20 +++++++++++-- .../migrations/versions/cf03bd6bae1d_init.py | 12 ++++++++ src/phoenix/db/models.py | 10 +++++++ src/phoenix/server/api/schema.py | 4 +++ src/phoenix/server/api/types/Project.py | 2 ++ 9 files changed, 106 insertions(+), 14 deletions(-) diff --git a/app/schema.graphql b/app/schema.graphql index 186919dd6c..bf518a774d 100644 --- a/app/schema.graphql +++ b/app/schema.graphql @@ -538,6 +538,8 @@ type Point3D { type Project implements Node { id: GlobalID! name: String! + gradientStartColor: String! + gradientEndColor: String! startTime: DateTime endTime: DateTime recordCount(timeRange: TimeRange): Int! diff --git a/app/src/pages/projects/ProjectsPage.tsx b/app/src/pages/projects/ProjectsPage.tsx index 6b28c41e5d..b8dc4c8e55 100644 --- a/app/src/pages/projects/ProjectsPage.tsx +++ b/app/src/pages/projects/ProjectsPage.tsx @@ -72,6 +72,8 @@ export function ProjectsPageContent({ timeRange }: { timeRange: TimeRange }) { project: node { id name + gradientStartColor + gradientEndColor traceCount(timeRange: $timeRange) endTime latencyMsP50: latencyMsQuantile( @@ -155,7 +157,13 @@ export function ProjectsPageContent({ timeRange }: { timeRange: TimeRange }) { ); } -function ProjectIcon() { +function ProjectIcon({ + gradientStartColor, + gradientEndColor, +}: { + gradientStartColor: string; + gradientEndColor: string; +}) { return (
{ if (endTime) { return `Last updated ${formatDistance(new Date(endTime), new Date(), { addSuffix: true })}`; @@ -209,7 +224,10 @@ function ProjectItem({ > - + > + * @generated SignedSource<<4b18018d5ea6f754fd9c0b1591bcc4a2>> * @lightSyntaxTransform * @nogrep */ @@ -15,6 +15,8 @@ export type ProjectsPageProjectsFragment$data = { readonly edges: ReadonlyArray<{ readonly project: { readonly endTime: string | null; + readonly gradientEndColor: string; + readonly gradientStartColor: string; readonly id: string; readonly latencyMsP50: number | null; readonly name: string; @@ -94,6 +96,20 @@ return { "name": "name", "storageKey": null }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientStartColor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientEndColor", + "storageKey": null + }, { "alias": null, "args": (v1/*: any*/), @@ -144,6 +160,6 @@ return { }; })(); -(node as any).hash = "80cfac4a7e56fc862924dce5da4ed971"; +(node as any).hash = "eed3bc970f109d273b6235f9eb0811ae"; export default node; diff --git a/app/src/pages/projects/__generated__/ProjectsPageProjectsQuery.graphql.ts b/app/src/pages/projects/__generated__/ProjectsPageProjectsQuery.graphql.ts index 75437862f4..7954926536 100644 --- a/app/src/pages/projects/__generated__/ProjectsPageProjectsQuery.graphql.ts +++ b/app/src/pages/projects/__generated__/ProjectsPageProjectsQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<72f2e8a0e846252624ba834ea2739ade>> + * @generated SignedSource<<2a8c4f4e6dc6baf963fd2dd708dc5909>> * @lightSyntaxTransform * @nogrep */ @@ -101,6 +101,20 @@ return { "name": "name", "storageKey": null }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientStartColor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientEndColor", + "storageKey": null + }, { "alias": null, "args": (v2/*: any*/), @@ -148,16 +162,16 @@ return { ] }, "params": { - "cacheID": "84f80c7e08a0397a97091aa2b4d45ae8", + "cacheID": "b7b294ef46695c71a41287c42ec9392f", "id": null, "metadata": {}, "name": "ProjectsPageProjectsQuery", "operationKind": "query", - "text": "query ProjectsPageProjectsQuery(\n $timeRange: TimeRange\n) {\n ...ProjectsPageProjectsFragment\n}\n\nfragment ProjectsPageProjectsFragment on Query {\n projects {\n edges {\n project: node {\n id\n name\n traceCount(timeRange: $timeRange)\n endTime\n latencyMsP50: latencyMsQuantile(probability: 0.5, timeRange: $timeRange)\n tokenCountTotal(timeRange: $timeRange)\n }\n }\n }\n}\n" + "text": "query ProjectsPageProjectsQuery(\n $timeRange: TimeRange\n) {\n ...ProjectsPageProjectsFragment\n}\n\nfragment ProjectsPageProjectsFragment on Query {\n projects {\n edges {\n project: node {\n id\n name\n gradientStartColor\n gradientEndColor\n traceCount(timeRange: $timeRange)\n endTime\n latencyMsP50: latencyMsQuantile(probability: 0.5, timeRange: $timeRange)\n tokenCountTotal(timeRange: $timeRange)\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "80cfac4a7e56fc862924dce5da4ed971"; +(node as any).hash = "eed3bc970f109d273b6235f9eb0811ae"; export default node; diff --git a/app/src/pages/projects/__generated__/ProjectsPageQuery.graphql.ts b/app/src/pages/projects/__generated__/ProjectsPageQuery.graphql.ts index a28896e78b..6689a994a8 100644 --- a/app/src/pages/projects/__generated__/ProjectsPageQuery.graphql.ts +++ b/app/src/pages/projects/__generated__/ProjectsPageQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<9258370758fe1af08d6cb85665285247>> + * @generated SignedSource<<2c9bcedff081a32e9f8aeb4d472a624d>> * @lightSyntaxTransform * @nogrep */ @@ -101,6 +101,20 @@ return { "name": "name", "storageKey": null }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientStartColor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "gradientEndColor", + "storageKey": null + }, { "alias": null, "args": (v2/*: any*/), @@ -148,12 +162,12 @@ return { ] }, "params": { - "cacheID": "991909413909af281a75c58c2cd6996b", + "cacheID": "9e5408cfa88c6d82157f9979960611bd", "id": null, "metadata": {}, "name": "ProjectsPageQuery", "operationKind": "query", - "text": "query ProjectsPageQuery(\n $timeRange: TimeRange!\n) {\n ...ProjectsPageProjectsFragment\n}\n\nfragment ProjectsPageProjectsFragment on Query {\n projects {\n edges {\n project: node {\n id\n name\n traceCount(timeRange: $timeRange)\n endTime\n latencyMsP50: latencyMsQuantile(probability: 0.5, timeRange: $timeRange)\n tokenCountTotal(timeRange: $timeRange)\n }\n }\n }\n}\n" + "text": "query ProjectsPageQuery(\n $timeRange: TimeRange!\n) {\n ...ProjectsPageProjectsFragment\n}\n\nfragment ProjectsPageProjectsFragment on Query {\n projects {\n edges {\n project: node {\n id\n name\n gradientStartColor\n gradientEndColor\n traceCount(timeRange: $timeRange)\n endTime\n latencyMsP50: latencyMsQuantile(probability: 0.5, timeRange: $timeRange)\n tokenCountTotal(timeRange: $timeRange)\n }\n }\n }\n}\n" } }; })(); diff --git a/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py b/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py index 753b9c419a..4001260ef4 100644 --- a/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +++ b/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py @@ -32,6 +32,18 @@ def upgrade() -> None: # TODO does the uniqueness constraint need to be named sa.Column("name", sa.String, nullable=False, unique=True), sa.Column("description", sa.String, nullable=True), + sa.Column( + "gradient_start_color", + sa.String, + nullable=False, + server_default=sa.text("'#5bdbff'"), + ), + sa.Column( + "gradient_end_color", + sa.String, + nullable=False, + server_default=sa.text("'#1c76fc'"), + ), sa.Column( "created_at", sa.TIMESTAMP(timezone=True), diff --git a/src/phoenix/db/models.py b/src/phoenix/db/models.py index 22e20329fc..fa1d24638d 100644 --- a/src/phoenix/db/models.py +++ b/src/phoenix/db/models.py @@ -10,6 +10,7 @@ Float, ForeignKey, MetaData, + String, TypeDecorator, UniqueConstraint, func, @@ -93,6 +94,15 @@ class Project(Base): id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] description: Mapped[Optional[str]] + gradient_start_color: Mapped[str] = mapped_column( + String, + server_default=func.text("'#5bdbff'"), + ) + + gradient_end_color: Mapped[str] = mapped_column( + String, + server_default=func.text("'#1c76fc'"), + ) created_at: Mapped[datetime] = mapped_column(UtcTimeStamp, server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( UtcTimeStamp, server_default=func.now(), onupdate=func.now() diff --git a/src/phoenix/server/api/schema.py b/src/phoenix/server/api/schema.py index c75880ec98..4040c82256 100644 --- a/src/phoenix/server/api/schema.py +++ b/src/phoenix/server/api/schema.py @@ -71,6 +71,8 @@ async def projects( Project( id_attr=project.id, name=project.name, + gradient_start_color=project.gradient_start_color, + gradient_end_color=project.gradient_end_color, project=info.context.traces.get_project(project.name), # type: ignore ) for project in projects @@ -109,6 +111,8 @@ async def node(self, id: GlobalID, info: Info[Context, None]) -> Node: return Project( id_attr=project.id, name=project.name, + gradient_start_color=project.gradient_start_color, + gradient_end_color=project.gradient_end_color, project=info.context.traces.get_project(project.name), # type: ignore ) raise Exception(f"Unknown node type: {type_name}") diff --git a/src/phoenix/server/api/types/Project.py b/src/phoenix/server/api/types/Project.py index 97b395f166..0d1e406542 100644 --- a/src/phoenix/server/api/types/Project.py +++ b/src/phoenix/server/api/types/Project.py @@ -36,6 +36,8 @@ @strawberry.type class Project(Node): name: str + gradient_start_color: str + gradient_end_color: str project: strawberry.Private[CoreProject] @strawberry.field From d339e7af65754b30f0d894c6694d49ae5dba89dd Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Tue, 23 Apr 2024 14:01:23 -0600 Subject: [PATCH 2/2] fix text --- src/phoenix/db/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/phoenix/db/models.py b/src/phoenix/db/models.py index fa1d24638d..8dd6c1955f 100644 --- a/src/phoenix/db/models.py +++ b/src/phoenix/db/models.py @@ -15,6 +15,7 @@ UniqueConstraint, func, insert, + text, ) from sqlalchemy.dialects import postgresql from sqlalchemy.ext.asyncio import AsyncEngine @@ -96,12 +97,12 @@ class Project(Base): description: Mapped[Optional[str]] gradient_start_color: Mapped[str] = mapped_column( String, - server_default=func.text("'#5bdbff'"), + server_default=text("'#5bdbff'"), ) gradient_end_color: Mapped[str] = mapped_column( String, - server_default=func.text("'#1c76fc'"), + server_default=text("'#1c76fc'"), ) created_at: Mapped[datetime] = mapped_column(UtcTimeStamp, server_default=func.now()) updated_at: Mapped[datetime] = mapped_column(