From 33eb213cc9c0323f3680596bbe1bf940be9c4c01 Mon Sep 17 00:00:00 2001 From: Loewy Date: Tue, 21 Jul 2026 13:18:21 -0700 Subject: [PATCH] Add Session Coach generation operations --- src/index.tsx | 279 +++++++++++++++++++++++++++++++ src/operations/session-coach.gql | 48 ++++++ src/schema.gql | 49 ++++++ 3 files changed, 376 insertions(+) diff --git a/src/index.tsx b/src/index.tsx index 842089e..d3844df 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -2554,6 +2554,7 @@ export type Mutation = { reactToVideo: Scalars["Boolean"]["output"]; recalculateChallengeEntry: ChallengeEntry; reportContent: Scalars["Boolean"]["output"]; + requestSessionCoachGeneration: SessionCoachGql; requestVideoExport: VideoExportJobGql; respondToChallengeInvitation: ChallengeInvitation; retireTags: Scalars["Boolean"]["output"]; @@ -2765,6 +2766,10 @@ export type MutationReportContentArgs = { videoId: Scalars["Int"]["input"]; }; +export type MutationRequestSessionCoachGenerationArgs = { + videoId: Scalars["Int"]["input"]; +}; + export type MutationRequestVideoExportArgs = { input: RequestVideoExportInput; }; @@ -3600,6 +3605,18 @@ export enum SessionCoachCandidateKindEnum { UsagePattern = "USAGE_PATTERN", } +export type SessionCoachDecisionGql = { + __typename?: "SessionCoachDecisionGQL"; + body?: Maybe; + drillId?: Maybe; + drillReason?: Maybe; + practiceAttemptCount?: Maybe; + practiceTarget?: Maybe; + selectedCandidateId?: Maybe; + suggestedAction?: Maybe; + title?: Maybe; +}; + export type SessionCoachEvidenceGql = { __typename?: "SessionCoachEvidenceGQL"; attemptCount: Scalars["Int"]["output"]; @@ -3618,6 +3635,7 @@ export type SessionCoachEvidenceGql = { export type SessionCoachGql = { __typename?: "SessionCoachGQL"; + agentGeneration?: Maybe; analysisVersion: Scalars["String"]["output"]; analyzedShotCount: Scalars["Int"]["output"]; candidates: Array; @@ -3636,6 +3654,44 @@ export type SessionCoachGql = { videoId: Scalars["Int"]["output"]; }; +export type SessionCoachGenerationDiagnosticsGql = { + __typename?: "SessionCoachGenerationDiagnosticsGQL"; + abstentionReason?: Maybe; + analysisVersion: Scalars["String"]["output"]; + attemptCount: Scalars["Int"]["output"]; + cachedInputTokens?: Maybe; + enqueueCount: Scalars["Int"]["output"]; + failureCode?: Maybe; + inputHash: Scalars["String"]["output"]; + inputTokens?: Maybe; + lastEnqueuedAt?: Maybe; + latencyMs?: Maybe; + maxAttempts: Scalars["Int"]["output"]; + modelName: Scalars["String"]["output"]; + outputTokens?: Maybe; + promptVersion: Scalars["String"]["output"]; + providerKey: Scalars["String"]["output"]; + startedAt?: Maybe; + updatedAt: Scalars["DateTime"]["output"]; +}; + +export type SessionCoachGenerationGql = { + __typename?: "SessionCoachGenerationGQL"; + completedAt?: Maybe; + createdAt: Scalars["DateTime"]["output"]; + decision?: Maybe; + diagnostics?: Maybe; + id: Scalars["ID"]["output"]; + state: SessionCoachGenerationStateEnum; +}; + +export enum SessionCoachGenerationStateEnum { + Failed = "FAILED", + Queued = "QUEUED", + Ready = "READY", + Running = "RUNNING", +} + export enum SessionCoachIneligibilityReasonEnum { Multiplayer = "MULTIPLAYER", } @@ -6911,6 +6967,94 @@ export type GetSessionCoachQuery = { rankReason: string; }; }>; + agentGeneration?: { + __typename?: "SessionCoachGenerationGQL"; + id: string; + state: SessionCoachGenerationStateEnum; + createdAt: any; + completedAt?: any | null; + decision?: { + __typename?: "SessionCoachDecisionGQL"; + selectedCandidateId?: string | null; + title?: string | null; + body?: string | null; + suggestedAction?: string | null; + drillId?: string | null; + drillReason?: string | null; + practiceAttemptCount?: number | null; + practiceTarget?: string | null; + } | null; + diagnostics?: { + __typename?: "SessionCoachGenerationDiagnosticsGQL"; + analysisVersion: string; + promptVersion: string; + providerKey: string; + modelName: string; + inputHash: string; + attemptCount: number; + maxAttempts: number; + enqueueCount: number; + latencyMs?: number | null; + inputTokens?: number | null; + cachedInputTokens?: number | null; + outputTokens?: number | null; + failureCode?: string | null; + updatedAt: any; + startedAt?: any | null; + lastEnqueuedAt?: any | null; + abstentionReason?: string | null; + } | null; + } | null; + }; +}; + +export type RequestSessionCoachGenerationMutationVariables = Exact<{ + videoId: Scalars["Int"]["input"]; +}>; + +export type RequestSessionCoachGenerationMutation = { + __typename?: "Mutation"; + requestSessionCoachGeneration: { + __typename?: "SessionCoachGQL"; + state: SessionCoachStateEnum; + agentGeneration?: { + __typename?: "SessionCoachGenerationGQL"; + id: string; + state: SessionCoachGenerationStateEnum; + createdAt: any; + completedAt?: any | null; + decision?: { + __typename?: "SessionCoachDecisionGQL"; + selectedCandidateId?: string | null; + title?: string | null; + body?: string | null; + suggestedAction?: string | null; + drillId?: string | null; + drillReason?: string | null; + practiceAttemptCount?: number | null; + practiceTarget?: string | null; + } | null; + diagnostics?: { + __typename?: "SessionCoachGenerationDiagnosticsGQL"; + analysisVersion: string; + promptVersion: string; + providerKey: string; + modelName: string; + inputHash: string; + attemptCount: number; + maxAttempts: number; + enqueueCount: number; + latencyMs?: number | null; + inputTokens?: number | null; + cachedInputTokens?: number | null; + outputTokens?: number | null; + failureCode?: string | null; + updatedAt: any; + startedAt?: any | null; + lastEnqueuedAt?: any | null; + abstentionReason?: string | null; + } | null; + } | null; }; }; @@ -6943,6 +7087,45 @@ export type SessionCoachCandidateFieldsFragment = { }; }; +export type SessionCoachGenerationFieldsFragment = { + __typename?: "SessionCoachGenerationGQL"; + id: string; + state: SessionCoachGenerationStateEnum; + createdAt: any; + completedAt?: any | null; + decision?: { + __typename?: "SessionCoachDecisionGQL"; + selectedCandidateId?: string | null; + title?: string | null; + body?: string | null; + suggestedAction?: string | null; + drillId?: string | null; + drillReason?: string | null; + practiceAttemptCount?: number | null; + practiceTarget?: string | null; + } | null; + diagnostics?: { + __typename?: "SessionCoachGenerationDiagnosticsGQL"; + analysisVersion: string; + promptVersion: string; + providerKey: string; + modelName: string; + inputHash: string; + attemptCount: number; + maxAttempts: number; + enqueueCount: number; + latencyMs?: number | null; + inputTokens?: number | null; + cachedInputTokens?: number | null; + outputTokens?: number | null; + failureCode?: string | null; + updatedAt: any; + startedAt?: any | null; + lastEnqueuedAt?: any | null; + abstentionReason?: string | null; + } | null; +}; + export type PlayerSummaryFieldsFragment = { __typename?: "PlayerSummaryGQL"; clusterId: number; @@ -9417,6 +9600,43 @@ export const SessionCoachCandidateFieldsFragmentDoc = gql` } } `; +export const SessionCoachGenerationFieldsFragmentDoc = gql` + fragment SessionCoachGenerationFields on SessionCoachGenerationGQL { + id + state + createdAt + completedAt + decision { + selectedCandidateId + title + body + suggestedAction + drillId + drillReason + practiceAttemptCount + practiceTarget + } + diagnostics { + analysisVersion + promptVersion + providerKey + modelName + inputHash + attemptCount + maxAttempts + enqueueCount + latencyMs + inputTokens + cachedInputTokens + outputTokens + failureCode + updatedAt + startedAt + lastEnqueuedAt + abstentionReason + } + } +`; export const PlayerClusterShotFieldsFragmentDoc = gql` fragment PlayerClusterShotFields on PlayerClusterShotGQL { shotId @@ -14862,9 +15082,13 @@ export const GetSessionCoachDocument = gql` candidates { ...SessionCoachCandidateFields } + agentGeneration { + ...SessionCoachGenerationFields + } } } ${SessionCoachCandidateFieldsFragmentDoc} + ${SessionCoachGenerationFieldsFragmentDoc} `; /** @@ -14932,6 +15156,61 @@ export type GetSessionCoachQueryResult = Apollo.QueryResult< GetSessionCoachQuery, GetSessionCoachQueryVariables >; +export const RequestSessionCoachGenerationDocument = gql` + mutation RequestSessionCoachGeneration($videoId: Int!) { + requestSessionCoachGeneration(videoId: $videoId) { + state + agentGeneration { + ...SessionCoachGenerationFields + } + } + } + ${SessionCoachGenerationFieldsFragmentDoc} +`; +export type RequestSessionCoachGenerationMutationFn = Apollo.MutationFunction< + RequestSessionCoachGenerationMutation, + RequestSessionCoachGenerationMutationVariables +>; + +/** + * __useRequestSessionCoachGenerationMutation__ + * + * To run a mutation, you first call `useRequestSessionCoachGenerationMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useRequestSessionCoachGenerationMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [requestSessionCoachGenerationMutation, { data, loading, error }] = useRequestSessionCoachGenerationMutation({ + * variables: { + * videoId: // value for 'videoId' + * }, + * }); + */ +export function useRequestSessionCoachGenerationMutation( + baseOptions?: Apollo.MutationHookOptions< + RequestSessionCoachGenerationMutation, + RequestSessionCoachGenerationMutationVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useMutation< + RequestSessionCoachGenerationMutation, + RequestSessionCoachGenerationMutationVariables + >(RequestSessionCoachGenerationDocument, options); +} +export type RequestSessionCoachGenerationMutationHookResult = ReturnType< + typeof useRequestSessionCoachGenerationMutation +>; +export type RequestSessionCoachGenerationMutationResult = + Apollo.MutationResult; +export type RequestSessionCoachGenerationMutationOptions = + Apollo.BaseMutationOptions< + RequestSessionCoachGenerationMutation, + RequestSessionCoachGenerationMutationVariables + >; export const VideoPlayerClustersDocument = gql` query VideoPlayerClusters($videoId: Int!) { videoPlayerClusters(videoId: $videoId) { diff --git a/src/operations/session-coach.gql b/src/operations/session-coach.gql index 70131fc..1cd9548 100644 --- a/src/operations/session-coach.gql +++ b/src/operations/session-coach.gql @@ -20,6 +20,18 @@ query GetSessionCoach($videoId: Int!) { candidates { ...SessionCoachCandidateFields } + agentGeneration { + ...SessionCoachGenerationFields + } + } +} + +mutation RequestSessionCoachGeneration($videoId: Int!) { + requestSessionCoachGeneration(videoId: $videoId) { + state + agentGeneration { + ...SessionCoachGenerationFields + } } } @@ -49,3 +61,39 @@ fragment SessionCoachCandidateFields on SessionCoachCandidateGQL { rankReason } } + +fragment SessionCoachGenerationFields on SessionCoachGenerationGQL { + id + state + createdAt + completedAt + decision { + selectedCandidateId + title + body + suggestedAction + drillId + drillReason + practiceAttemptCount + practiceTarget + } + diagnostics { + analysisVersion + promptVersion + providerKey + modelName + inputHash + attemptCount + maxAttempts + enqueueCount + latencyMs + inputTokens + cachedInputTokens + outputTokens + failureCode + updatedAt + startedAt + lastEnqueuedAt + abstentionReason + } +} diff --git a/src/schema.gql b/src/schema.gql index 7a3b282..e2c900d 100644 --- a/src/schema.gql +++ b/src/schema.gql @@ -716,6 +716,7 @@ type Mutation { shotId: Int! fieldsToEdit: EditableShotFieldInputGQL! ): EditShotReturn! + requestSessionCoachGeneration(videoId: Int!): SessionCoachGQL! getProfileImageUploadLink( fileExt: String = ".png" ): GetProfileUploadLinkReturn! @@ -1320,6 +1321,17 @@ enum SessionCoachCandidateKindEnum { USAGE_PATTERN } +type SessionCoachDecisionGQL { + selectedCandidateId: ID + title: String + body: String + suggestedAction: String + drillId: String + drillReason: String + practiceAttemptCount: Int + practiceTarget: String +} + type SessionCoachEvidenceGQL { bucketKey: String! bucketLabel: String! @@ -1352,6 +1364,43 @@ type SessionCoachGQL { makePercentage: Float primaryCandidate: SessionCoachCandidateGQL candidates: [SessionCoachCandidateGQL!]! + agentGeneration: SessionCoachGenerationGQL +} + +type SessionCoachGenerationDiagnosticsGQL { + analysisVersion: String! + promptVersion: String! + providerKey: String! + modelName: String! + inputHash: String! + attemptCount: Int! + maxAttempts: Int! + enqueueCount: Int! + latencyMs: Int + inputTokens: Int + cachedInputTokens: Int + outputTokens: Int + failureCode: String + updatedAt: DateTime! + startedAt: DateTime + lastEnqueuedAt: DateTime + abstentionReason: String +} + +type SessionCoachGenerationGQL { + id: ID! + state: SessionCoachGenerationStateEnum! + createdAt: DateTime! + completedAt: DateTime + decision: SessionCoachDecisionGQL + diagnostics: SessionCoachGenerationDiagnosticsGQL +} + +enum SessionCoachGenerationStateEnum { + QUEUED + RUNNING + READY + FAILED } enum SessionCoachIneligibilityReasonEnum {