AI 코치 채팅 — Ai::CoachService + AiConversationsController + Turbo Stream 실시간 채팅 + 테스트
ID: 1a61c225-f972-4ff1-a97d-c9d0c8bc1117
## 목표
AI 코치 채팅. AiConversation CRUD + Ai::CoachService (Claude API) + Turbo Stream 실시간 메시지.
## 현재 상태
- AiConversationsController 스텁 (index, create, show + message member)
- 라우트: `resources :ai_conversations, only: [:index, :create, :show] do post :message, on: :member end`
- AiConversation 모델: belongs_to :user, :project(optional). conversation_type, messages(jsonb, default: []), total_tokens_used, model_used
## 구현 사항
### 1. Ai::CoachService
```ruby
class Ai::CoachService
def initialize(conversation:)
@conversation = conversation
@user = conversation.user
@client = Anthropic::Client.new(api_key: ENV["ANTHROPIC_API_KEY"])
end
def call(user_message)
# messages jsonb에 유저 메시지 추가
@conversation.messages << { role: "user", content: user_message, created_at: Time.current.iso8601 }
# Claude API 호출
response = @client.messages(
model: "claude-sonnet-4-6", max_tokens: 2000,
system: system_prompt,
messages: @conversation.messages.map { |m| { role: m["role"], content: m["content"] } }
)
assistant_message = response.content.first.text
@conversation.messages << { role: "assistant", content: assistant_message, created_at: Time.current.iso8601 }
@conversation.save!
assistant_message
end
private
def system_prompt
project_context = @conversation.project ? "프로젝트: #{@conversation.project.title} - #{@conversation.project.one_line_definition}" : ""
"VALUEIT AI 코치. 20대가 서비스를 만들도록 돕는 멘토. 한국어로 답변. #{project_context}"
end
end
```
### 2. AiConversationsController
- index: Current.user.ai_conversations 목록
- create: 새 대화 생성 (project_id optional)
- show: 대화 상세 + 메시지 목록
- message: 메시지 전송 → CoachService 호출 → Turbo Stream 응답
### 3. 뷰
- index: 대화 목록 (최근순), "새 대화" 버튼
- show: 채팅 UI (메시지 버블, 입력 폼, turbo_stream_from)
- _message partial: 유저/AI 메시지 스타일 분리
- Turbo Stream: 메시지 전송 시 append
### 4. DI 패턴 (client: 파라미터), 에러 처리, 한국어, 다크 테마
### ⚠️ ai_conversations/ + services/ai/ 범위만 (developer-2는 mailers/ 작업 중)
### 테스트
- CoachService: 메시지 추가, API mock, 프로젝트 컨텍스트
- AiConversationsController: index, create, show, message(인증/소유자)
### 완료 기준
- 새 대화 생성 + 메시지 전송 + AI 응답 + Turbo Stream
- bin/rails test 전체 통과
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
Ddeveloper-1 상태 변경: 할 일 → 리뷰
2026년 03월 26일 12:33:44