Spaces:
Build error
Build error
| # ่ทๆถฏ่ซฎ่ฉขๅๆก็ฎก็็ณป็ตฑ - ๆถๆง่จญ่จๆไปถ | |
| ## ๅฐๆก็ฎๆจ | |
| ๆ้ ไธๅ**ๅทฎ็ฐๅ็ๅฉไบบ่ ๅฐๆฅญๅทฅๅ ท**๏ผ็ธ่ผๆผไธ่ฌ็ใ้้ณ โ AI ๆ่ฆใๅทฅๅ ท๏ผๆๅๆไพ๏ผ | |
| ### ๆ ธๅฟๅนๅผไธปๅผต | |
| 1. **ไธ้ตๆดๅ**๏ผ้้ณ โ ้ๅญ็จฟ โ ๅฐๆฅญๅ ฑๅ โ ๅๆก็ฎก็็ณป็ตฑ | |
| 2. **ๅฐๆฅญๆจๆบ**๏ผ็ฌฆๅๅฉไบบๅฐๆฅญ็ๅ ฑๅ็ตๆง๏ผ่ทๆธธๆจๆบๆกๆถ๏ผ | |
| 3. **็ดฏ็ฉๅๆชๆก**๏ผๆฏๆดๅๆกๆญท็จ่ฟฝ่นคใ่ทจๆฌกๆค่ซๅๆ | |
| 4. **ๆบ่ฝ้ฃๅ**๏ผๅ ฑๅ่ชๅ่ใไพ่จช่ ๆญท็จใใ่ซฎ่ฉข็ญ็ฅๅปบ่ญฐใใๅ่จชๆ้ใ้ฃๅ | |
| 5. **ๅฐๆฅญๅ AI**๏ผ็ถ้ๅฐๆฅญ้กงๅ่ชฟๆ็ๅฐ่ฉฑ่จญ่จ๏ผ็ฌฆๅๅฉไบบๅซ็ใ็ฃๅฐ็ตๆง๏ผ | |
| 6. **ๅฎข่ฃฝๅ็ฅ่ญๅบซ**๏ผ่ซฎ่ฉขๅธซๅฏ้ธๆ็นๅฎๆไปถ้ฒ่ก RAG ๆชข็ดข | |
| --- | |
| ## ็ณป็ตฑๆถๆงๆฆ่ฆฝ | |
| ``` | |
| โโโโโโโโโโโโโโโ | |
| โ iOS App โ ้้ณ โ ่ฝ้ๅญ็จฟ | |
| โโโโโโโโฌโโโโโโโ | |
| โ API Call | |
| โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ Backend API Server โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โ โ Session Management (ๅๆก็ฎก็) โ โ | |
| โ โ - ่ชๅๅตๅปบ/ๆดๆฐๅๆกๆชๆก โ โ | |
| โ โ - ๆค่ซๆฌกๆธ็ดฏ่จ โ โ | |
| โ โ - ๆญท็จ่ฟฝ่นค โ โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โ โ AI Report Generation (ๅ ฑๅ็ๆ) โ โ | |
| โ โ - RAG ็ฅ่ญๆชข็ดข โ โ | |
| โ โ - ็ตๆงๅๅ ฑๅ็ๆ โ โ | |
| โ โ - ๅฐ่ฉฑ็ฏ้ๆๅ โ โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โ โ Counselor Agent (ๅฎข่ฃฝๅ AI) โ โ | |
| โ โ - ๆไปถ้ธๆ โ โ | |
| โ โ - ็ฅ่ญๅบซ้ๆฟพ โ โ | |
| โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ | |
| โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ Supabase Database โ | |
| โ - clients (ๅๆกๅบๆฌ่ณๆ) โ | |
| โ - sessions (ๆค่ซ็ด้) โ | |
| โ - session_reports (AI ็ๆๅ ฑๅ) โ | |
| โ - counselor_agents (่ซฎ่ฉขๅธซ AI ่จญๅฎ) โ | |
| โ - documents + chunks + embeddings (RAG) โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ``` | |
| --- | |
| ## ๆ ธๅฟไฝฟ็จๆ ๅข | |
| ### ๆ ๅข 1๏ผ้ฆๆฌกๆค่ซ (iOS โ Backend) | |
| **iOS ็ซฏๆไฝ**๏ผ | |
| 1. ่ซฎ่ฉขๅธซๅจ App ไธญ้้ณ | |
| 2. App ่ชๅ่ฝ้ๅญ็จฟ | |
| 3. ๅกซๅฏซๅๆกๅบๆฌ่ณๆ๏ผๅงๅใๅนด้ฝกใๆงๅฅ็ญ๏ผ | |
| 4. ้ปๆใ็ๆๅ ฑๅใ | |
| **API Request**๏ผ | |
| ```json | |
| POST /api/sessions/generate-report | |
| { | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "client": { | |
| "code": "CL_ๅฐๆ", | |
| "name": "ๅฐๆ", | |
| "age": 25, | |
| "gender": "็ท", | |
| "occupation": "่ป้ซๅทฅ็จๅธซ", | |
| "education": "ๅคงๅญธ", | |
| "location": "ๅฐๅ" | |
| }, | |
| "session": { | |
| "transcript": "Co: ไฝ ๅฅฝ๏ผไปๅคฉๆณ่ไป้บผ๏ผ\nCl: ๆๆ่ฟๅฐๅทฅไฝๆๅฐๅพๅฐๆ...", | |
| "num_participants": 2, | |
| "session_date": "2025-01-15T10:00:00" | |
| } | |
| } | |
| ``` | |
| **Backend ่็ๆต็จ**๏ผ | |
| 1. โ ๆชขๆฅ `client_code` ๆฏๅฆๅญๅจ | |
| - ไธๅญๅจ โ ๅตๅปบๆฐๅๆกๆชๆก๏ผ`clients` ่กจ๏ผ | |
| - ๅญๅจ โ ็ฅ้ | |
| 2. โ ๅตๅปบๆฐ็ Session ็ด้๏ผ`sessions` ่กจ๏ผ | |
| - ่ชๅ็ดฏๅ `session_number` (็ฌฌ 1 ๆฌก) | |
| - ๅฒๅญ้ๅญ็จฟ | |
| 3. โ ๅผๅซ AI ็ๆๅ ฑๅ | |
| - RAG ๆชข็ดข็ธ้็่ซ๏ผๆ นๆ counselor ็ Agent ่จญๅฎ้ธๆๆไปถ๏ผ | |
| - ็ๆ็ตๆงๅๅ ฑๅ | |
| 4. โ ๅฒๅญๅ ฑๅ๏ผ`session_reports` ่กจ๏ผ | |
| 5. โ ๆดๆฐๅๆก็ตฑ่จ๏ผ็ธฝๆค่ซๆฌกๆธใๆๅพๆค่ซๆ้๏ผ | |
| **API Response (SSE Stream)**๏ผ | |
| ``` | |
| data: {"step": 1, "status": "processing", "message": "ๆญฃๅจๅๆ้ๅญ็จฟ็ตๆง..."} | |
| data: {"step": 2, "status": "completed", "message": "่ญๅฅๅฐ 2 ๅ้้ต่ญฐ้ก"} | |
| data: {"step": 3, "status": "processing", "message": "ๆญฃๅจๆชข็ดข็ธ้็่ซ..."} | |
| ... | |
| data: {"step": 5, "status": "completed", "data": {"report": {...}}} | |
| ``` | |
| ๆ็ตๅๅณๅฎๆดๅ ฑๅ JSON | |
| --- | |
| ### ๆ ๅข 2๏ผ็ฌฌไบๆฌกๆค่ซ (็ฐกๅๆต็จ) | |
| **iOS ็ซฏๆไฝ**๏ผ | |
| 1. ้ธๆๆขๆๅๆกใๅฐๆใ | |
| 2. ้้ณ โ ่ฝ้ๅญ็จฟ | |
| 3. ้ปๆใ็ๆๅ ฑๅใ | |
| **API Request**๏ผ | |
| ```json | |
| POST /api/sessions/generate-report | |
| { | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "client": { | |
| "code": "CL_ๅฐๆ" | |
| // ไธ้่ฆๅๅณๅบๆฌ่ณๆ๏ผๅพ็ซฏ่ชๅๅๅพ | |
| }, | |
| "session": { | |
| "transcript": "Co: ไธๆฌกๆๅ่ๅฐ่ทๆถฏๅฐๆพ...", | |
| "num_participants": 2, | |
| "session_date": "2025-01-22T10:00:00" | |
| } | |
| } | |
| ``` | |
| **Backend ่็**๏ผ | |
| 1. โ ๆ นๆ `client_code` ๅๅพๆขๆๅๆก่ณๆ | |
| 2. โ ๅตๅปบ็ฌฌ 2 ๆฌก Session๏ผ`session_number = 2`๏ผ | |
| 3. โ ็ๆๅ ฑๅๆๅฏๅ่ๆญทๆฌกๆค่ซๅ งๅฎน๏ผoptional๏ผๆชไพๅ่ฝ๏ผ | |
| 4. โ ๅฒๅญไธฆๅๅณๅ ฑๅ | |
| --- | |
| ### ๆ ๅข 3๏ผๆฅ่ฉขๅๆกๆญท็จ (iOS ๆ Web) | |
| **API Request**๏ผ | |
| ```json | |
| GET /api/clients/CO_ๅผต่ๅธซ/CL_ๅฐๆ/history | |
| ``` | |
| **Response**๏ผ | |
| ```json | |
| { | |
| "client": { | |
| "code": "CL_ๅฐๆ", | |
| "name": "ๅฐๆ", | |
| "age": 25, | |
| "gender": "็ท", | |
| "total_sessions": 2, | |
| "first_session_date": "2025-01-15T10:00:00", | |
| "last_session_date": "2025-01-22T10:00:00", | |
| "status": "active" | |
| }, | |
| "sessions": [ | |
| { | |
| "session_id": 123, | |
| "session_number": 1, | |
| "session_date": "2025-01-15T10:00:00", | |
| "summary": "ๅๆฌกๆค่ซ๏ผๆข็ดข่ทๆถฏๅฐๆพ๏ผไฝฟ็จ็ๆถฏๅก็", | |
| "main_concerns": ["่ทๆถฏ่ฝๆ", "ๅทฅไฝๅฃๅ"] | |
| }, | |
| { | |
| "session_id": 124, | |
| "session_number": 2, | |
| "session_date": "2025-01-22T10:00:00", | |
| "summary": "ๆทฑๅ ฅๆข็ดขๅนๅผ่ง๏ผ้ฒ่ก่่ถฃๆธฌ้ฉ", | |
| "main_concerns": ["่ชๆๆข็ดข", "ๆฑบ็ญๅฐ้ฃ"] | |
| } | |
| ] | |
| } | |
| ``` | |
| --- | |
| ### ๆ ๅข 4๏ผๅๅพ็นๅฎๅ ฑๅ่ฉณๆ | |
| **API Request**๏ผ | |
| ```json | |
| GET /api/sessions/123/report | |
| ``` | |
| **Response**๏ผ | |
| ```json | |
| { | |
| "session_id": 123, | |
| "client_info": { | |
| "name": "ๅฐๆ", | |
| "age": 25, | |
| "gender": "็ท" | |
| }, | |
| "session_summary": { | |
| "content": "ๅๆก่กจ้ๆณ่ฆ่ฝๆ่ท้็ๆณๆณ...", | |
| "self_evaluation": "ๅๆฌกๆค่ซ๏ผๅปบ็ซ่ฏๅฅฝ้ไฟ" | |
| }, | |
| "conceptualization": "ใไธป่จดๅ้กใ\nๅๆก่กจ้ๅฐ็ฎๅ่ป้ซๅทฅ็จๅธซๅทฅไฝๆๅฐๅฆๆ ...", | |
| "main_concerns": ["่ทๆถฏ่ฝๆ", "ๅทฅไฝ็ๆดปๅนณ่กก"], | |
| "counseling_goals": ["้ๆธ ่ทๆถฏๆนๅ", "ๆนๅๅทฅไฝๅฃๅ"], | |
| "techniques": ["ๅ็ๅฟๅๆ", "็ๆถฏๅกๆข็ดข"], | |
| "theories": [ | |
| { | |
| "text": "Super ็็ๆถฏ็ผๅฑ็่ซๆๅบ...", | |
| "document": "็ๆถฏ็ผๅฑ็่ซ", | |
| "score": 0.85 | |
| } | |
| ], | |
| "dialogue_excerpts": [ | |
| {"speaker": "speaker1", "order": 1, "text": "่ฝ่ตทไพไฝ ๅฐ็ฎๅ็ๅทฅไฝๆๅฐไธไบๅฐๆพ๏ผ"}, | |
| {"speaker": "speaker2", "order": 2, "text": "ๆฏ็๏ผๆ่ฆบๅพๆฏๅคฉๅฏซ็จๅผๅพ็ดฏ"} | |
| ] | |
| } | |
| ``` | |
| --- | |
| ## ่ณๆๅบซ่จญ่จ | |
| ### 1. `clients` - ๅๆกๅบๆฌ่ณๆ | |
| | ๆฌไฝ | ๅๅฅ | ่ชชๆ | | |
| |------|------|------| | |
| | id | SERIAL | Primary Key | | |
| | client_code | VARCHAR(100) | ๅฏไธ่ญๅฅ็ขผ๏ผๆ ผๅผ๏ผ`{counselor_code}_{alias}` | | |
| | counselor_code | VARCHAR(100) | ๆๅฑฌ่ซฎ่ฉขๅธซ | | |
| | name | VARCHAR(200) | ๅๅ | | |
| | gender | VARCHAR(50) | ๆงๅฅ | | |
| | age | INTEGER | ๅนด้ฝก | | |
| | occupation | VARCHAR(200) | ่ทๆฅญ | | |
| | education | VARCHAR(200) | ๅญธๆญท | | |
| | location | VARCHAR(200) | ๅฑ ไฝๅฐ | | |
| | economic_status | VARCHAR(200) | ็ถๆฟ็ๆณ | | |
| | family_relations | TEXT | ๅฎถๅบญ้ไฟ | | |
| | status | VARCHAR(50) | active/inactive/completed | | |
| | first_session_date | TIMESTAMP | ้ฆๆฌกๆค่ซๆ้ | | |
| | last_session_date | TIMESTAMP | ๆๅพๆค่ซๆ้ | | |
| | total_sessions | INTEGER | ็ธฝๆค่ซๆฌกๆธ | | |
| | notes | TEXT | ่ซฎ่ฉขๅธซๅ่จป | | |
| | tags | TEXT[] | ๆจ็ฑค | | |
| | created_at | TIMESTAMP | ๅปบๆชๆ้ | | |
| | updated_at | TIMESTAMP | ๆดๆฐๆ้ | | |
| ### 2. `sessions` - ๆค่ซ็ด้ | |
| | ๆฌไฝ | ๅๅฅ | ่ชชๆ | | |
| |------|------|------| | |
| | id | SERIAL | Primary Key | | |
| | client_id | INTEGER | FK โ clients.id | | |
| | counselor_code | VARCHAR(100) | ่ซฎ่ฉขๅธซไปฃ็ขผ | | |
| | session_number | INTEGER | ็ฌฌๅนพๆฌกๆค่ซ | | |
| | session_date | TIMESTAMP | ๆค่ซๆฅๆ | | |
| | duration_minutes | INTEGER | ๆ้ท๏ผๅ้๏ผ | | |
| | session_type | VARCHAR(50) | individual/group/online/offline | | |
| | transcript | TEXT | ๅๅง้ๅญ็จฟ | | |
| | num_participants | INTEGER | ๆ่ซไบบๆธ๏ผdefault 2๏ผ | | |
| | status | VARCHAR(50) | draft/completed/reviewed | | |
| | created_at | TIMESTAMP | ๅปบ็ซๆ้ | | |
| | updated_at | TIMESTAMP | ๆดๆฐๆ้ | | |
| **Unique Constraint**: `(client_id, session_number)` | |
| ### 3. `session_reports` - AI ็ๆๅ ฑๅ | |
| | ๆฌไฝ | ๅๅฅ | ่ชชๆ | | |
| |------|------|------| | |
| | id | SERIAL | Primary Key | | |
| | session_id | INTEGER | FK โ sessions.id | | |
| | client_info | JSONB | ๅๆกๅบๆฌ่ณ่จ | | |
| | session_summary | JSONB | ๆค่ซๆ่ฆ | | |
| | conceptualization | TEXT | ๆฆๅฟตๅๅๆ๏ผๅฎๆดๆๅญ๏ผ | | |
| | main_concerns | TEXT[] | ไธป่จดๅ้กๅ่กจ | | |
| | counseling_goals | TEXT[] | ่ซฎ่ฉข็ฎๆจๅ่กจ | | |
| | techniques | TEXT[] | ไฝฟ็จๆๅทงๅ่กจ | | |
| | dialogue_excerpts | JSONB | ๅฐ่ฉฑ็ฏ้ | | |
| | theories | JSONB | ็ธ้็่ซๆ็ป | | |
| | client_progress | TEXT | ๅๆก้ฒๅฑ๏ผๆชไพๅ่ฝ๏ผ | | |
| | next_steps | TEXT | ๅพ็บๅปบ่ญฐ | | |
| | follow_up_date | TIMESTAMP | ๅ่จชๆฅๆ๏ผๆชไพๅ่ฝ๏ผ | | |
| | supervision_notes | TEXT | ็ฃๅฐ่จ่ซๅ งๅฎน๏ผๆชไพๅ่ฝ๏ผ | | |
| | generated_at | TIMESTAMP | ๅ ฑๅ็ๆๆ้ | | |
| | updated_at | TIMESTAMP | ๆดๆฐๆ้ | | |
| ### 4. `counselor_agents` - ่ซฎ่ฉขๅธซๅฎข่ฃฝๅ AI | |
| | ๆฌไฝ | ๅๅฅ | ่ชชๆ | | |
| |------|------|------| | |
| | id | SERIAL | Primary Key | | |
| | counselor_code | VARCHAR(100) | ่ซฎ่ฉขๅธซไปฃ็ขผ๏ผUnique๏ผ | | |
| | agent_name | VARCHAR(200) | Agent ๅ็จฑ | | |
| | selected_document_ids | INTEGER[] | ้ธๆ็ๆๆช IDs | | |
| | selected_tags | TEXT[] | ๆๆๆจ็ฑค็ฏฉ้ธ๏ผๆชไพ๏ผ | | |
| | system_prompt | TEXT | ๅฎข่ฃฝๅ prompt๏ผๆชไพ๏ผ | | |
| | temperature | FLOAT | ๆบซๅบฆๅๆธ๏ผๆชไพ๏ผ | | |
| | top_k | INTEGER | RAG top_k๏ผdefault 5๏ผ | | |
| | similarity_threshold | FLOAT | ็ธไผผๅบฆ้ๆชป๏ผdefault 0.5๏ผ | | |
| | specialties | TEXT[] | ๅฐ้ท้ ๅ๏ผๆชไพ๏ผ | | |
| | approach | TEXT | ่ซฎ่ฉขๅๅ๏ผๆชไพ๏ผ | | |
| | total_sessions | INTEGER | ไฝฟ็จๆฌกๆธ | | |
| | last_used_at | TIMESTAMP | ๆๅพไฝฟ็จๆ้ | | |
| | created_at | TIMESTAMP | ๅปบ็ซๆ้ | | |
| | updated_at | TIMESTAMP | ๆดๆฐๆ้ | | |
| ### 5. `client_progress_timeline` - ๅๆก้ฒๅฑๆ้่ปธ๏ผๆชไพๅ่ฝ๏ผ | |
| | ๆฌไฝ | ๅๅฅ | ่ชชๆ | | |
| |------|------|------| | |
| | id | SERIAL | Primary Key | | |
| | client_id | INTEGER | FK โ clients.id | | |
| | session_id | INTEGER | FK โ sessions.id | | |
| | stage | VARCHAR(100) | ้ๆฎต๏ผๆข็ดขๆ/ๅทฅไฝๆ/็ตๆๆ๏ผ | | |
| | progress_score | INTEGER | ้ฒๅฑ่ฉๅ 1-10 | | |
| | mood_score | INTEGER | ๆ ็ท็ๆ 1-10 | | |
| | milestones | TEXT[] | ้็จ็ข | | |
| | breakthroughs | TEXT | ็ช็ ด้ป | | |
| | challenges | TEXT | ๆๆฐ | | |
| | counselor_notes | TEXT | ่ซฎ่ฉขๅธซ่งๅฏ | | |
| | created_at | TIMESTAMP | ๅปบ็ซๆ้ | | |
| --- | |
| ## API ่จญ่จ่ฆๆ ผ | |
| ### ๆ ธๅฟ API๏ผPhase 1 - ๅชๅ ๅฏฆไฝ๏ผ | |
| #### 1. ็ๆไธฆๅฒๅญๅ ฑๅ | |
| ``` | |
| POST /api/sessions/generate-report | |
| Content-Type: application/json | |
| Request Body: | |
| { | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "client": { | |
| "code": "CL_ๅฐๆ", | |
| "name": "ๅฐๆ", // ้ฆๆฌกๅฟ ๅกซ | |
| "age": 25, // ้ฆๆฌกๅฟ ๅกซ | |
| "gender": "็ท", // ้ฆๆฌกๅฟ ๅกซ | |
| "occupation": "่ป้ซๅทฅ็จๅธซ", // ้ธๅกซ | |
| "education": "ๅคงๅญธ", // ้ธๅกซ | |
| "location": "ๅฐๅ", // ้ธๅกซ | |
| "economic_status": "็ฉฉๅฎ", // ้ธๅกซ | |
| "family_relations": "ๅทฒๅฉ" // ้ธๅกซ | |
| }, | |
| "session": { | |
| "transcript": "Co: ไฝ ๅฅฝ...", | |
| "num_participants": 2, | |
| "session_date": "2025-01-15T10:00:00", | |
| "duration_minutes": 60 // ้ธๅกซ | |
| } | |
| } | |
| Response: SSE Stream | |
| Content-Type: text/event-stream | |
| data: {"step": 1, "status": "processing", "message": "ๆญฃๅจๅๆ้ๅญ็จฟ็ตๆง..."} | |
| data: {"step": 1, "status": "completed", "message": "้ๅญ็จฟๅๆๅฎๆ", "data": {...}} | |
| data: {"step": 2, "status": "processing", "message": "ๆญฃๅจ่ญๅฅ้้ต่ญฐ้ก..."} | |
| ... | |
| data: {"step": 5, "status": "completed", "message": "ๅๆกๅ ฑๅ็ๆๅฎๆ", "data": {"report": {...}, "session_id": 123}} | |
| data: {"step": 6, "status": "completed", "message": "ๅ จ้จๅฎๆ๏ผ"} | |
| ``` | |
| **่็้่ผฏ**๏ผ | |
| 1. ๆชขๆฅ `client_code` ๆฏๅฆๅญๅจๆผ `clients` ่กจ | |
| 2. ่ฅไธๅญๅจ โ INSERT ๆฐๅๆก | |
| 3. ่ฅๅญๅจ โ ๅๅพ `client_id` | |
| 4. INSERT ๆฐ็ `session` ็ด้๏ผ่ชๅ่จ็ฎ `session_number`๏ผ | |
| 5. ๅผๅซ AI ็ๆๅ ฑๅ๏ผๆดๅ็พๆ็ `generate_report_stream`๏ผ | |
| 6. INSERT `session_reports` ็ด้ | |
| 7. UPDATE `clients` ็ `total_sessions`, `last_session_date` | |
| 8. ๅๅณๅฎๆดๅ ฑๅ + `session_id` | |
| --- | |
| #### 2. ๆฅ่ฉข่ซฎ่ฉขๅธซ็ๅๆกๅ่กจ | |
| ``` | |
| GET /api/counselors/{counselor_code}/clients | |
| Query Parameters: | |
| - status: active/inactive/completed (้ธๅกซ) | |
| - limit: 20 (้ธๅกซ) | |
| - offset: 0 (้ธๅกซ) | |
| Response: | |
| { | |
| "total": 15, | |
| "clients": [ | |
| { | |
| "code": "CL_ๅฐๆ", | |
| "name": "ๅฐๆ", | |
| "age": 25, | |
| "gender": "็ท", | |
| "total_sessions": 3, | |
| "last_session_date": "2025-01-22T10:00:00", | |
| "status": "active", | |
| "tags": ["่ทๆถฏๅฐๆพ", "็ฆๆ ฎ"] | |
| }, | |
| ... | |
| ] | |
| } | |
| ``` | |
| --- | |
| #### 3. ๆฅ่ฉขๅๆกๆญท็จ | |
| ``` | |
| GET /api/clients/{counselor_code}/{client_code}/history | |
| Response: | |
| { | |
| "client": { | |
| "code": "CL_ๅฐๆ", | |
| "name": "ๅฐๆ", | |
| "age": 25, | |
| "gender": "็ท", | |
| "occupation": "่ป้ซๅทฅ็จๅธซ", | |
| "total_sessions": 3, | |
| "first_session_date": "2025-01-15T10:00:00", | |
| "last_session_date": "2025-01-22T10:00:00", | |
| "status": "active" | |
| }, | |
| "sessions": [ | |
| { | |
| "session_id": 123, | |
| "session_number": 1, | |
| "session_date": "2025-01-15T10:00:00", | |
| "duration_minutes": 60, | |
| "summary": "ๅๆฌกๆค่ซ๏ผๆข็ดข่ทๆถฏๅฐๆพ", | |
| "main_concerns": ["่ทๆถฏ่ฝๆ", "ๅทฅไฝๅฃๅ"] | |
| }, | |
| ... | |
| ] | |
| } | |
| ``` | |
| --- | |
| #### 4. ๅๅพ็นๅฎๅ ฑๅ | |
| ``` | |
| GET /api/sessions/{session_id}/report | |
| Response: | |
| { | |
| "session_id": 123, | |
| "session_number": 1, | |
| "session_date": "2025-01-15T10:00:00", | |
| "client_info": { ... }, | |
| "session_summary": { ... }, | |
| "conceptualization": "...", | |
| "main_concerns": [...], | |
| "counseling_goals": [...], | |
| "techniques": [...], | |
| "theories": [...], | |
| "dialogue_excerpts": [...] | |
| } | |
| ``` | |
| --- | |
| ### Agent ่จญๅฎ API๏ผPhase 1 - ็ฐกๅ็๏ผ | |
| #### 5. ่จญๅฎ่ซฎ่ฉขๅธซ็ Agent | |
| ``` | |
| POST /api/agents/config | |
| Request: | |
| { | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "agent_name": "่ทๆถฏ่ซฎ่ฉขๅฐ็จ AI", | |
| "selected_document_ids": [1, 3, 5, 7] // ้ธๆ็นๅฎๆๆช | |
| } | |
| Response: | |
| { | |
| "success": true, | |
| "message": "Agent ่จญๅฎๅทฒๆดๆฐ", | |
| "agent": { | |
| "id": 1, | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "agent_name": "่ทๆถฏ่ซฎ่ฉขๅฐ็จ AI", | |
| "selected_document_ids": [1, 3, 5, 7], | |
| "top_k": 5, | |
| "similarity_threshold": 0.5 | |
| } | |
| } | |
| ``` | |
| --- | |
| #### 6. ๅๅพ่ซฎ่ฉขๅธซ็ Agent ่จญๅฎ | |
| ``` | |
| GET /api/agents/{counselor_code}/config | |
| Response: | |
| { | |
| "agent": { | |
| "id": 1, | |
| "counselor_code": "CO_ๅผต่ๅธซ", | |
| "agent_name": "่ทๆถฏ่ซฎ่ฉขๅฐ็จ AI", | |
| "selected_document_ids": [1, 3, 5, 7], | |
| "top_k": 5, | |
| "similarity_threshold": 0.5, | |
| "total_sessions": 15, | |
| "last_used_at": "2025-01-22T10:00:00" | |
| } | |
| } | |
| ``` | |
| --- | |
| ## ่บซไปฝ่ญๅฅ็ญ็ฅ | |
| ### ่ซฎ่ฉขๅธซ่ญๅฅ๏ผCounselor Code๏ผ | |
| **ๆ ผๅผๅปบ่ญฐ**๏ผ | |
| ``` | |
| CO_{ๅงๅ/ๆฑ็จฑ} | |
| ไพๅฆ๏ผCO_ๅผต่ๅธซใCO_ๆๅฟ็ๅธซ | |
| ``` | |
| **็นๆง**๏ผ | |
| - ไธ้่ฆๅฏ็ขผ๏ผๆซๆ๏ผ | |
| - ็ฑ iOS ็ซฏๅฒๅญไธฆ่ชๅๅธถๅ ฅ | |
| - ๆชไพๅฏ่ๆ ฎ่ฃ็ฝฎ็ถๅฎๆ็ฐกๆ PIN ็ขผ | |
| ### ๅๆก่ญๅฅ๏ผClient Code๏ผ | |
| **ๆ ผๅผๅปบ่ญฐ**๏ผ | |
| ``` | |
| CL_{ๅๅ/ไปฃ่} | |
| ๆ | |
| {counselor_code}_CL_{ๅๅ} | |
| ไพๅฆ๏ผ | |
| - CL_ๅฐๆ | |
| - CO_ๅผต่ๅธซ_CL_ๅฐๆ | |
| ``` | |
| **็นๆง**๏ผ | |
| - ็ฑ่ซฎ่ฉขๅธซๅจ iOS ็ซฏ่ผธๅ ฅ | |
| - ็ขบไฟๅจ่ฉฒ่ซฎ่ฉขๅธซไธๅฏไธๅณๅฏ | |
| - ไธ้่ฆ่ทจ่ซฎ่ฉขๅธซๅฏไธ๏ผๆชไพ่ฅ้่ฝไปๅ่ชฟๆด๏ผ | |
| --- | |
| ## ่ณๆๅฒๅญ็ญ็ฅ | |
| ### โ ๅฒๅญ็่ณๆ | |
| 1. **่ซฎ่ฉขๅธซๅบๆฌ่ณๆ** | |
| - counselor_code, name | |
| 2. **ๅๆกๅบๆฌ่ณๆ** | |
| - ๆๆ `clients` ่กจๆฌไฝ | |
| 3. **ๆค่ซ็ด้** | |
| - ้ๅญ็จฟ๏ผ`transcript`๏ผ | |
| - ๆค่ซๆ้ใๆฌกๆธใๆ้ท | |
| 4. **AI ็ๆๅ ฑๅ** | |
| - ๅฎๆด็็ตๆงๅๅ ฑๅๅ งๅฎน | |
| 5. **Agent ่จญๅฎ** | |
| - ๆๆช้ธๆ่จญๅฎ | |
| ### โ ไธๅฒๅญ็่ณๆ | |
| 1. **้้ณๆช** | |
| - ็ฑ iOS ๆฌๅฐๅฒๅญ | |
| - ๆชไพ่ฅ้่ฆๅฏ่ๆ ฎ S3/Supabase Storage | |
| 2. **่ซฎ่ฉขๅธซๅไบบ่จญๅฎ**๏ผๆซๆ๏ผ | |
| - system_prompt, temperature ็ญ้ฒ้่จญๅฎ | |
| - Phase 2 ๅๅฏฆไฝ | |
| --- | |
| ## RAG ๆดๅ็ญ็ฅ | |
| ### ็พๆ RAG ๆถๆง | |
| ``` | |
| documents โ chunks โ embeddings | |
| ``` | |
| ### Agent ๅฆไฝ้ธๆๆไปถ | |
| **ๆนๅผ 1๏ผ้ธๆ็นๅฎๆๆช**๏ผPhase 1 ๅฏฆไฝ๏ผ | |
| ```python | |
| # ๅพ counselor_agents ๅๅพ selected_document_ids | |
| agent = get_counselor_agent(counselor_code) | |
| selected_doc_ids = agent.selected_document_ids # [1, 3, 5, 7] | |
| # RAG ๆฅ่ฉขๆ้ๆฟพ | |
| WHERE c.doc_id IN :selected_doc_ids | |
| ``` | |
| **ๆนๅผ 2๏ผๆจ็ฑค็ฏฉ้ธ**๏ผๆชไพ๏ผ | |
| ```python | |
| # ๆๆชๅ ไธๆจ็ฑค | |
| documents.tags = ["่ทๆถฏ่ซฎ่ฉข", "็ๆถฏ่ฆๅ"] | |
| # Agent ่จญๅฎ้ธๆๆจ็ฑค | |
| agent.selected_tags = ["่ทๆถฏ่ซฎ่ฉข"] | |
| # ๆฅ่ฉขๆ้ๆฟพ | |
| WHERE d.tags && :selected_tags | |
| ``` | |
| --- | |
| ## Phase 1 ๅฏฆไฝๅชๅ ้ ๅบ | |
| ### ไปๅคฉๅฎๆ๏ผๆ ธๅฟๅ่ฝ๏ผ | |
| 1. โ ่ณๆๅบซ Migration๏ผๅทฒๅฎๆ SQL๏ผ | |
| 2. โณ ๅท่ก Migration | |
| 3. โณ ๅฏฆไฝ `POST /api/sessions/generate-report` | |
| - ๆดๅ็พๆ็ `generate_report_stream` | |
| - ๅ ๅ ฅๅๆกๅตๅปบ/ๆดๆฐ้่ผฏ | |
| - ๅ ๅ ฅ Session ๅฒๅญ้่ผฏ | |
| - ๅ ๅ ฅ Report ๅฒๅญ้่ผฏ | |
| 4. โณ ๅฏฆไฝ็ฐกๆ Agent ่จญๅฎ API | |
| - `POST /api/agents/config` | |
| - `GET /api/agents/{counselor_code}/config` | |
| 5. โณ ๆธฌ่ฉฆ iOS ไธฒๆฅ | |
| ### ๆๅคฉๅฎๆ๏ผๆฅ่ฉขๅ่ฝ๏ผ | |
| 6. `GET /api/counselors/{counselor_code}/clients` | |
| 7. `GET /api/clients/{counselor_code}/{client_code}/history` | |
| 8. `GET /api/sessions/{session_id}/report` | |
| ### ๅพๅคฉ+๏ผWeb ็ฎก็ไป้ข๏ผ | |
| 9. ่ซฎ่ฉขๅธซ็ปๅ ฅ้ ้ข๏ผ่ผธๅ ฅ counselor_code๏ผ | |
| 10. ๅๆกๅ่กจ้ ้ข | |
| 11. ๅๆก่ฉณๆ + ๆญท็จๆ้่ปธ้ ้ข | |
| 12. Agent ่จญๅฎ้ ้ข๏ผ้ธๆๆๆช๏ผ | |
| --- | |
| ## ๆชไพๆดๅ ๅ่ฝ๏ผPhase 2+๏ผ | |
| ### ้ฒ้ CRM ๅ่ฝ | |
| - ๅ่จชๆ้๏ผ`follow_up_date`๏ผ | |
| - ๅๆก้ฒๅบฆ่ฉๅ๏ผ`client_progress_timeline`๏ผ | |
| - ้ๆฎตๅๆ๏ผๆข็ดขๆ/ๅทฅไฝๆ/็ตๆๆ๏ผ | |
| ### ๅไฝๅ่ฝ | |
| - ่ทจ่ซฎ่ฉขๅธซ่ฝไป | |
| - ็ฃๅฐ่จ่ซๅ่ฝ๏ผ`supervision_notes`๏ผ | |
| - ๅ้ๅไฝ | |
| ### ้ฒ้ Agent ๅ่ฝ | |
| - ่ช่จ system_prompt | |
| - ่ชฟๆด temperature | |
| - ๅฐ้ท้ ๅๆจ็ฑค | |
| ### ่ณๆๅๆ | |
| - ่ซฎ่ฉขๅธซ็ตฑ่จๅ่กจๆฟ | |
| - ๅๆกๆนๅ็ๅๆ | |
| - ็ฑ้่ญฐ้ก่ฟฝ่นค | |
| --- | |
| ## ๆ่กๆฃง | |
| - **Backend**: FastAPI + Python 3.10+ | |
| - **Database**: Supabase (PostgreSQL + pgvector) | |
| - **AI**: OpenAI GPT-4o-mini + text-embedding-3-small | |
| - **Frontend**: Next.js 14 + React + TypeScript | |
| - **iOS**: Swift (็ฑๅ้ๅ ถไปๆๅก้็ผ) | |
| --- | |
| ## ่ณๆ้ฑ็ง่ๅฎๅ จ | |
| ### ็พ้ๆฎต๏ผMVP๏ผ | |
| - ไธๅฒๅญ้้ณๆช | |
| - ้ๅญ็จฟๅๅ ฑๅๅฒๅญๅจ Supabase๏ผๅทฒๅ ๅฏๅณ่ผธ๏ผ | |
| - ็ฐกๆไปฃ็ขผ่ญๅฅ๏ผcounselor_code๏ผ | |
| ### ๆชไพ่ฆๅ | |
| - ็ซฏๅฐ็ซฏๅ ๅฏ๏ผE2EE๏ผ | |
| - ็ฌฆๅ GDPR/HIPAA ่ฆ็ฏ | |
| - ่ณๆๅฟๅๅ้ธ้ | |
| - ๅฎๆ่ณๆๅไปฝ | |
| - ่ณๆๅช้คๆฌ๏ผRight to be forgotten๏ผ | |
| --- | |
| ## API ้ฏ่ชค่็ | |
| ### ๆจๆบ้ฏ่ชคๆ ผๅผ | |
| ```json | |
| { | |
| "error": { | |
| "code": "CLIENT_NOT_FOUND", | |
| "message": "ๆพไธๅฐ่ฉฒๅๆก่ณๆ", | |
| "details": { | |
| "client_code": "CL_ๅฐๆ", | |
| "counselor_code": "CO_ๅผต่ๅธซ" | |
| } | |
| } | |
| } | |
| ``` | |
| ### ๅธธ่ฆ้ฏ่ชค็ขผ | |
| - `CLIENT_NOT_FOUND`: ๅๆกไธๅญๅจ | |
| - `COUNSELOR_NOT_FOUND`: ่ซฎ่ฉขๅธซไธๅญๅจ | |
| - `SESSION_NOT_FOUND`: ๆค่ซ็ด้ไธๅญๅจ | |
| - `INVALID_TRANSCRIPT`: ้ๅญ็จฟๆ ผๅผ้ฏ่ชค | |
| - `AGENT_NOT_CONFIGURED`: Agent ๆช่จญๅฎ | |
| - `DOCUMENT_NOT_FOUND`: ๆๆชไธๅญๅจ | |
| --- | |
| ## ๆธฌ่ฉฆ็ญ็ฅ | |
| ### ๅฎๅ ๆธฌ่ฉฆ | |
| - ๅๆกๅตๅปบ/ๆดๆฐ้่ผฏ | |
| - Session ็ทจ่่ชๅ็ดฏๅ | |
| - Report ่ณๆ่งฃๆ | |
| ### ๆดๅๆธฌ่ฉฆ | |
| - iOS โ API โ Database ๅฎๆดๆต็จ | |
| - RAG ๆๆช้ๆฟพๅ่ฝ | |
| - SSE ไธฒๆตๆธฌ่ฉฆ | |
| ### E2E ๆธฌ่ฉฆ | |
| - ้ฆๆฌกๆค่ซๅฎๆดๆต็จ | |
| - ๅพ็บๆค่ซๆต็จ | |
| - ๆญท็จๆฅ่ฉขๅ่ฝ | |
| --- | |
| ## ้จ็ฝฒๆถๆง๏ผๆชไพ๏ผ | |
| ``` | |
| โโโโโโโโโโโโ | |
| โ iOS App โ | |
| โโโโโโฌโโโโโโ | |
| โ | |
| โ | |
| โโโโโโโโโโโโโโโโโโโโ | |
| โ Cloudflare / CDN โ | |
| โโโโโโฌโโโโโโโโโโโโโโ | |
| โ | |
| โ | |
| โโโโโโโโโโโโโโโโโโโโ | |
| โ FastAPI Server โ (Railway / Render / AWS) | |
| โ (Load Balanced) โ | |
| โโโโโโฌโโโโโโโโโโโโโโ | |
| โ | |
| โ | |
| โโโโโโโโโโโโโโโโโโโโ | |
| โ Supabase โ | |
| โ (PostgreSQL + โ | |
| โ pgvector) โ | |
| โโโโโโโโโโโโโโโโโโโโ | |
| ``` | |
| --- | |
| ## ่ฎๆดๆญทๅฒ | |
| | ๆฅๆ | ็ๆฌ | ่ฎๆดๅ งๅฎน | | |
| |------|------|----------| | |
| | 2025-01-XX | 0.1 | ๅ็ๆถๆง่จญ่จ | | |
| --- | |
| **ๆไปถไฝ่ **: Claude + Young | |
| **ๆๅพๆดๆฐ**: 2025-01-XX | |
| **็ๆ **: ่ฆๅไธญ โ ๆบๅๅฏฆไฝ | |