세션 평가와 교수자 분석 보강

This commit is contained in:
Yun Chan 2026-07-01 12:10:52 +09:00
parent 5c4ac04e06
commit fe2796f05a
51 changed files with 4928 additions and 240 deletions

View file

@ -1144,6 +1144,26 @@ export interface paths {
patch?: never;
trace?: never;
};
"/teacher/learners/{learner_id}/analysis": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Learner Analysis
* @description Return one learner's full teacher-visible session timeline and trend.
*/
get: operations["learner_analysis_teacher_learners__learner_id__analysis_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/teacher/sessions/{session_id}/review-status": {
parameters: {
query?: never;
@ -1987,10 +2007,19 @@ export interface components {
deep?: Record<string, never> | null;
/** Distribution */
distribution?: Record<string, never>;
/**
* Durable
* @default false
*/
durable: boolean;
/** Error */
error?: string | null;
/** Session Id */
session_id: string;
/** Stage */
stage?: ("라포" | "탐색" | "개입" | "정리") | null;
/** Status */
status?: string | null;
};
/** HTTPValidationError */
HTTPValidationError: {
@ -3600,6 +3629,37 @@ export interface components {
*/
watch_count: number;
};
/** TeacherLearnerAnalysisResponse */
TeacherLearnerAnalysisResponse: {
/** Active Sessions */
active_sessions: number;
/** Closed Reviews */
closed_reviews: number;
/** Ended Sessions */
ended_sessions: number;
/** Learner Id */
learner_id: string;
/** Learner Label */
learner_label: string;
/** Message */
message: string;
/** Pending Reviews */
pending_reviews: number;
/** Points */
points?: components["schemas"]["TeacherGrowthPoint"][];
/** Sessions */
sessions?: components["schemas"]["TeacherSessionSummary"][];
/**
* Source
* @default in_memory
*/
source: string;
/** Stage Breakdown */
stage_breakdown?: components["schemas"]["TeacherStageBreakdown"][];
summary: components["schemas"]["TeacherLearnerGrowth"];
/** Total Sessions */
total_sessions: number;
};
/** TeacherLearnerGrowth */
TeacherLearnerGrowth: {
/** Avg Rapport */
@ -3760,6 +3820,24 @@ export interface components {
/** Turn Count */
turn_count: number;
};
/** TeacherStageBreakdown */
TeacherStageBreakdown: {
/**
* Sessions
* @default 0
*/
sessions: number;
/**
* Stage
* @enum {string}
*/
stage: "라포" | "탐색" | "개입" | "정리";
/**
* Turns
* @default 0
*/
turns: number;
};
/**
* TechniqueDistribution
* @description deep-loop + / .
@ -6303,6 +6381,40 @@ export interface operations {
};
};
};
learner_analysis_teacher_learners__learner_id__analysis_get: {
parameters: {
query?: never;
header?: never;
path: {
learner_id: string;
};
cookie?: {
"__Host-vignette_sid"?: string | null;
vignette_sid?: string | null;
};
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["TeacherLearnerAnalysisResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
update_session_review_status_teacher_sessions__session_id__review_status_put: {
parameters: {
query?: never;

View file

@ -205,6 +205,8 @@ export type LiveCoachEvent = ApiSchema<"LiveCoachEvent">;
export type LiveCoachHistoryResponse = ApiSchema<"LiveCoachHistoryResponse">;
export type LiveCoachSuggestion = ApiSchema<"LiveCoachSuggestion">;
export type LiveCoachSource = ApiSchema<"LiveCoachSource">;
export type ReevaluateRequest = ApiSchema<"ReevaluateRequest">;
export type SessionEvaluationResponse = ApiSchema<"SessionEvaluationResponse">;
/** POST /sessions/{id}/end — sessions.py SessionEndResponse */
export type SessionEndResponse = ApiSchema<"SessionEndResponse">;
@ -474,6 +476,17 @@ export const sessionApi = {
stream: openSessionStream,
};
export const evalApi = {
reevaluateSession: (
sessionId: string,
payload: ReevaluateRequest = { scope: "session_end" },
) =>
api.post<SessionEvaluationResponse>(
`/eval/sessions/${encodeURIComponent(sessionId)}/reevaluate`,
payload,
),
};
export type AdminHealthStatus = ApiSchema<"AdminHealthResponse">["status"];
export type AdminServiceHealth = ApiSchema<"AdminServiceHealth">;
export type AdminHealthResponse = ApiSchema<"AdminHealthResponse">;
@ -547,14 +560,20 @@ export type TeacherSessionSummary = ApiSchema<"TeacherSessionSummary">;
export type TeacherSafetyAlert = ApiSchema<"TeacherSafetyAlert">;
export type TeacherGrowthPoint = ApiSchema<"TeacherGrowthPoint">;
export type TeacherStageBreakdown = ApiSchema<"TeacherStageBreakdown">;
export type TeacherLearnerGrowth = ApiSchema<"TeacherLearnerGrowth">;
export type TeacherLearnerAnalysisResponse = ApiSchema<"TeacherLearnerAnalysisResponse">;
export type TeacherDashboardResponse = ApiSchema<"TeacherDashboardResponse">;
export type TeacherSessionReviewStatusRequest = ApiSchema<"TeacherSessionReviewStatusRequest">;
export type TeacherSessionReviewStatusResponse = ApiSchema<"TeacherSessionReviewStatusResponse">;
export const teacherApi = {
dashboard: () => api.get<TeacherDashboardResponse>("/teacher/dashboard"),
learnerAnalysis: (learnerId: string) =>
api.get<TeacherLearnerAnalysisResponse>(
`/teacher/learners/${encodeURIComponent(learnerId)}/analysis`,
),
updateSessionReviewStatus: (
sessionId: string,
body: TeacherSessionReviewStatusRequest,