Some checks failed
ci / ci (22, ubuntu-latest) (push) Failing after 25m52s
Made-with: Cursor
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import Anthropic from '@anthropic-ai/sdk'
|
|
|
|
const SYSTEM_PROMPT = `당신은 캠핑 장비 전문 AI 어시스턴트입니다.
|
|
사용자의 캠핑 활동과 장비 선택에 대해 전문적인 조언을 제공합니다.
|
|
|
|
주요 역할:
|
|
- 브랜드별, 가격대별, 계절별 장비 추천
|
|
- 장비 간 호환성 및 조합 제안
|
|
- 중고 장비 구매/판매 관련 조언
|
|
- 캠핑 스타일(백패킹, 오토캠핑, 글램핑 등)에 맞는 장비 선택
|
|
- 유지보수 및 관리 방법 안내
|
|
|
|
응답 스타일:
|
|
- 한국어로 친절하고 전문적으로 답변
|
|
- 구체적인 제품명, 가격대, 구매처 정보 포함
|
|
- 사용자의 예산과 필요에 맞는 현실적인 추천 제공`
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const config = useRuntimeConfig()
|
|
const body = await readBody(event)
|
|
|
|
const { messages } = body as {
|
|
conversationId: string
|
|
messages: Array<{ role: 'user' | 'assistant', content: string }>
|
|
}
|
|
|
|
const anthropic = new Anthropic({ apiKey: config.anthropicApiKey })
|
|
|
|
const stream = anthropic.messages.stream({
|
|
model: 'claude-sonnet-4-6',
|
|
max_tokens: 2048,
|
|
system: SYSTEM_PROMPT,
|
|
messages: messages.filter(m => m.content.trim())
|
|
})
|
|
|
|
const readableStream = new ReadableStream({
|
|
async start(controller) {
|
|
stream.on('text', (text) => {
|
|
controller.enqueue(new TextEncoder().encode(text))
|
|
})
|
|
stream.on('finalMessage', () => {
|
|
controller.close()
|
|
})
|
|
stream.on('error', (err) => {
|
|
controller.error(err)
|
|
})
|
|
}
|
|
})
|
|
|
|
return sendStream(event, readableStream)
|
|
})
|