Base URL: https://dilemmai.org
์ฃผ์ ์๋ํฌ์ธํธ: POST /chat/multi-step
๋จ๊ณ ์์: opening โ question โ flip โ roles โ ending
๋ค๋จ๊ณ ์ฑ๋ด ๋ํ ์งํ
{
"session_id": "unique-session-id",
"user_input": "์ฌ์ฉ์ ์
๋ ฅ ํ
์คํธ",
"step": "opening", // ์ ํ์ฌํญ (์ฒซ ์์ฒญ์๋ง ๋ช
์, ์ดํ๋ ์๋ ์งํ)
"variable": { // ์ ํ์ฌํญ (ํ
์คํธ์ฉ ๋๋ ํน์ ๋ณ์๋ฅผ ์ง์ ์ ๋ฌํ ๋)
"topic": "AI ์ค๋ฆฌ",
"question": "...",
"choice1": "...",
"choice2": "..."
}
}ํ๋ผ๋ฏธํฐ ์ค๋ช :
session_id(ํ์): ์ธ์ ๊ณ ์ IDuser_input(ํ์): ์ฌ์ฉ์ ์ ๋ ฅ ํ ์คํธstep(์ ํ): ์คํํ ๋จ๊ณ ์ง์ (์ฒซ ์์ฒญ์๋ง ์ฌ์ฉ)variable(์ ํ): OpenAI ํ๋กฌํํธ์ ์ง์ ์ ๋ฌํ ๋ณ์๋ค (ํ ์คํธ ๋๋ ๋๋ฒ๊น ์ฉ)
{
"session_id": "unique-session-id",
"current_step": "opening",
"response_text": "์ฑ๋ด ์๋ต ํ
์คํธ (์ฌ์ฉ์์๊ฒ ํ์)",
"parsed_variables": {
// ๋จ๊ณ๋ณ๋ก ์ถ์ถ๋ ๊ตฌ์กฐํ๋ ๋ณ์๋ค
},
"context": {
// ์ ์ฒด ๋ํ ์ปจํ
์คํธ (๋ชจ๋ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ)
},
"next_step": "question", // ๋ค์ ๋จ๊ณ (๋ง์ง๋ง์ด๋ฉด null)
"is_complete": false // ์๋ฃ ์ฌ๋ถ (ending ๋จ๊ณ์์ true)
}opening โ question โ flip โ roles โ ending
| ๋จ๊ณ | ์ ๋ ฅ ๋ณ์ | ์ถ๋ ฅ ๋ณ์ (parsed_variables) |
|---|---|---|
| opening | ์์ | topic |
| question | topic |
question, choice1, choice2 |
| flip | question, choice1, choice2 |
dilemma_situation, question, choice1, flips_agree_texts, choice2, flips_disagree_texts |
| roles | flip์ 6๊ฐ ๋ณ์ | char1, chardes1, char2, chardes2, char3, chardes3 |
| ending | flip์ 6๊ฐ + roles์ 6๊ฐ | opening, char1~3, chardes1~3, dilemma_situation, question, agree_label, disagree_label, flips_agree_texts, flips_disagree_texts, agreeEnding, disagreeEnding |
- ๋ฐฑ์๋๋ context์
{step}_{variable}ํ์์ผ๋ก ์ ์ฅ (์:opening_topic) - ๋ค์ ๋จ๊ณ ํธ์ถ ์ ์๋์ผ๋ก ํ์ํ ๋ณ์๋ฅผ ๋งคํํ์ฌ OpenAI ํ๋กฌํํธ์ ์ ๋ฌ
- ํ๋ก ํธ์๋๋ ์ ๊ฒฝ ์ธ ํ์ ์์ (๋ฐฑ์๋๊ฐ ์๋ ์ฒ๋ฆฌ)
์ ์ ํ๋: ์ฃผ์ ํ์
์ฑ๋ด ํ๋: parsed_variables์ topic ๋ฐํ
๋ค์ ๋จ๊ณ: ์ ์ ๊ฐ "๋ค์ ๋จ๊ณ" ์ ๋ ฅ โ question ๋จ๊ณ๋ก ์ด๋
{
topic: string // ํ์ ๋ AI ์ฃผ์
}{
"session_id": "session-123",
"current_step": "opening",
"response_text": "[์ฑ๋ด์ด ์์ฑํ ์๋ต ํ
์คํธ]",
"parsed_variables": {
"topic": "AI ์ค๋ฆฌ"
},
"next_step": "question",
"is_complete": false
}์
๋ ฅ: opening ๋จ๊ณ์์ ๋ฐ์ topic
์ ์ ํ๋: ์ง๋ฌธ ํ์
์ฑ๋ด ํ๋: parsed_variables์ question, choice1, choice2 ๋ฐํ
๋ค์ ๋จ๊ณ: ์ ์ ๊ฐ "๋ค์ ๋จ๊ณ" ์ ๋ ฅ โ flip ๋จ๊ณ๋ก ์ด๋ (question, choice1, choice2๋ฅผ variable๋ก ์ ๋ฌ)
{
question: string // ๋๋ ๋ง ์ง๋ฌธ
choice1: string // ์ ํ์ง 1
choice2: string // ์ ํ์ง 2
}{
"session_id": "session-123",
"current_step": "question",
"response_text": "[์ฑ๋ด์ด ์์ฑํ ์๋ต ํ
์คํธ]",
"parsed_variables": {
"question": "AI ์์คํ
์ด ์ต๋ํ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ด๋ค ์ ํ์ ํด์ผ ํ ๊น์?",
"choice1": "์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด ํน์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?",
"choice2": "๊ณต์ ์ฑ์ ์ํด ๋ชจ๋ ์ง๋จ์ ๋ํด ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๊ฒ์ธ๊ฐ?"
},
"next_step": "flip",
"is_complete": false
}์
๋ ฅ: question ๋จ๊ณ์์ ๋ฐ์ question, choice1, choice2
์ฑ๋ด ํ๋: ์๋๋ฆฌ์ค์ ํ๋ฆฝ ์ํฉ ๊ฒฐ์
์ถ๋ ฅ: parsed_variables์ 6๊ฐ ๋ณ์ ๋ฐํ
dilemma_situation: ์ํฉ ์๋๋ฆฌ์คquestion: ์ง๋ฌธchoice1: ์ ํ์ง 1 (agree_label)flips_agree_texts: ์ ํ์ง 1์ ๋ํ ํ๋ฆฝ ์๋ฃchoice2: ์ ํ์ง 2 (disagree_label)flips_disagree_texts: ์ ํ์ง 2์ ๋ํ ํ๋ฆฝ ์๋ฃ
๋ค์ ๋จ๊ณ: ์ ์ ๊ฐ "๋ค์ ๋จ๊ณ" ์ ๋ ฅ โ roles ๋จ๊ณ๋ก ์ด๋ (์ 6๊ฐ ๋ณ์๋ฅผ ์ ๋ฌ)
{
dilemma_situation: string // ์ํฉ ์๋๋ฆฌ์ค
question: string // ๋๋ ๋ง ์ง๋ฌธ
choice1: string // ์ ํ์ง 1
flips_agree_texts: string // ์ ํ์ง 1 ํ๋ฆฝ ์๋ฃ
choice2: string // ์ ํ์ง 2
flips_disagree_texts: string // ์ ํ์ง 2 ํ๋ฆฝ ์๋ฃ
}{
"session_id": "session-123",
"current_step": "flip",
"response_text": "[์ฑ๋ด์ด ์์ฑํ ์๋๋ฆฌ์ค์ ํ๋ฆฝ ์ํฉ ํ
์คํธ]",
"parsed_variables": {
"dilemma_situation": "AI ์์คํ
์ด ํ๊ต์์ ํ์๋ค์ ์ฑ์ ์ ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค...",
"question": "AI ์์คํ
์ด ์ต๋ํ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด...",
"choice1": "์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด ํน์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?",
"flips_agree_texts": "์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ค์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฐ๊ณผ...",
"choice2": "๊ณต์ ์ฑ์ ์ํด ๋ชจ๋ ์ง๋จ์ ๋ํด ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๊ฒ์ธ๊ฐ?",
"flips_disagree_texts": "๋ชจ๋ ์ง๋จ์ ๋ํด ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ์ดํฐ์ ๊ท ํ์ ๋ง์ถ ๊ฒฐ๊ณผ..."
},
"next_step": "roles",
"is_complete": false
}์ ๋ ฅ: flip ๋จ๊ณ์์ ๋ฐ์ 6๊ฐ ๋ณ์
dilemma_situation,question,choice1,flips_agree_texts,choice2,flips_disagree_texts
์ฑ๋ด ํ๋: ์ญํ ๊ทน ์ธ๋ฌผ 3๋ช ์ค๊ณ
์ถ๋ ฅ: parsed_variables์ 6๊ฐ ๋ณ์ ๋ฐํ
char1,charDes1: ์ญํ 1 ์ด๋ฆ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ชchar2,charDes2: ์ญํ 2 ์ด๋ฆ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ชchar3,charDes3: ์ญํ 3 ์ด๋ฆ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ช
๋ค์ ๋จ๊ณ: ์ ์ ๊ฐ "๋ค์ ๋จ๊ณ" ์ ๋ ฅ โ ending ๋จ๊ณ๋ก ์ด๋ (flip 6๊ฐ + roles 6๊ฐ ๋ณ์ ์ ๋ฌ)
{
char1: string // ์ญํ 1 ์ด๋ฆ
chardes1: string // ์ญํ 1 ๋ฐฐ๊ฒฝ ์ค๋ช
char2: string // ์ญํ 2 ์ด๋ฆ
chardes2: string // ์ญํ 2 ๋ฐฐ๊ฒฝ ์ค๋ช
char3: string // ์ญํ 3 ์ด๋ฆ
chardes3: string // ์ญํ 3 ๋ฐฐ๊ฒฝ ์ค๋ช
}{
"session_id": "session-123",
"current_step": "roles",
"response_text": "[์ฑ๋ด์ด ์์ฑํ ์ญํ ์ ์ ํ
์คํธ]",
"parsed_variables": {
"char1": "ํ์",
"chardes1": "๋น์ ์ ์คํ๊ต 3ํ๋
ํ์์ด๋ฉฐ, AI ์์คํ
์ ์ฑ์ ์์ธก ๋ฐฉ์์ ๋ํด ์ ์๊ณ ์์ต๋๋ค...",
"char2": "๊ต์ฌ",
"chardes2": "๋น์ ์ 10๋
๊ฒฝ๋ ฅ์ ๊ณ ๋ฑํ๊ต ๊ต์ฌ์
๋๋ค...",
"char3": "ํ๋ถ๋ชจ",
"chardes3": "๋น์ ์ ์คํ๊ต 1ํ๋
์๋
๋ฅผ ๋ ํ๋ถ๋ชจ๋ก..."
},
"next_step": "ending",
"is_complete": false
}์ ๋ ฅ: flip ๋จ๊ณ์ 6๊ฐ ๋ณ์ + roles ๋จ๊ณ์ 6๊ฐ ๋ณ์ (์ด 12๊ฐ)
์ฑ๋ด ํ๋: ์ต์ข ํ ํ๋ฆฟ ์์ฑ (์คํ๋, ์ญํ , ์๋๋ฆฌ์ค, ์ง๋ฌธ, ์ ํ์ง, ํ๋ฆฝ ์๋ฃ, ์ต์ข ๋ฉํธ ํฌํจ)
์ถ๋ ฅ: parsed_variables์ 15๊ฐ ๋ณ์ ๋ฐํ
์๋ฃ: is_complete: true, next_step: null
{
opening: string[] // ์คํ๋ ๋ฉํธ (๋ฌธ์ฅ ๋ฐฐ์ด)
char1: string // ์ญํ 1 ์ด๋ฆ
chardes1: string // ์ญํ 1 ๋ฐฐ๊ฒฝ ์ค๋ช
char2: string // ์ญํ 2 ์ด๋ฆ
chardes2: string // ์ญํ 2 ๋ฐฐ๊ฒฝ ์ค๋ช
char3: string // ์ญํ 3 ์ด๋ฆ
chardes3: string // ์ญํ 3 ๋ฐฐ๊ฒฝ ์ค๋ช
dilemma_situation: string[] // ์ํฉ ์๋๋ฆฌ์ค (๋ฌธ์ฅ ๋ฐฐ์ด)
question: string // ๋๋ ๋ง ์ง๋ฌธ
agree_label: string // ์ ํ์ง 1 ๋ผ๋ฒจ
disagree_label: string // ์ ํ์ง 2 ๋ผ๋ฒจ
flips_agree_texts: string[] // ์ ํ์ง 1 ํ๋ฆฝ ์๋ฃ (๋ฌธ์ฅ ๋ฐฐ์ด)
flips_disagree_texts: string[] // ์ ํ์ง 2 ํ๋ฆฝ ์๋ฃ (๋ฌธ์ฅ ๋ฐฐ์ด)
agreeEnding: string // ์ ํ์ง 1 ์ต์ข
๋ฉํธ
disagreeEnding: string // ์ ํ์ง 2 ์ต์ข
๋ฉํธ
}{
"session_id": "session-123",
"current_step": "ending",
"response_text": "[์ฑ๋ด์ด ์์ฑํ ์ต์ข
์ด์ ํ
์คํธ]",
"parsed_variables": {
"opening": [
"ํ๊ต์ AI ์์คํ
์ด ๋์
๋ ์ง ํ ๋ฌ์ด ์ง๋ฌ์ต๋๋ค.",
"ํ์๋ค์ ์ฑ์ ์ ์์ธกํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋ ์ด ์์คํ
์ ํ๋ถ๋ชจ์ ๊ต์ฌ๋ค ์ฌ์ด์์ ๊ธฐ๋์ ์ฐ๋ ค๋ฅผ ๋์์ ๋ถ๋ฌ์ผ์ผํค๊ณ ์์ต๋๋ค.",
"์ค๋, ํ๊ต๋ ๋ฐ๋์ ์ฐฌ์ฑ์ ๋๋๋ ๊ณต์ฒญํ๋ฅผ ๊ฐ์ตํ๊ธฐ๋ก ํ์๊ณ , ์ด ์๋ฆฌ์๋ AI ์์คํ
๊ฐ๋ฐ์, ํ์ ๋ํ, ๊ทธ๋ฆฌ๊ณ ํ๋ถ๋ชจ๊ฐ ๋ชจ์์ต๋๋ค.",
"์ฌ๋ฌ๋ถ์ ๊ฐ์์ ์
์ฅ์์ ์ด ์ ๊ธฐ์ ์ ์ค๋ฆฌ์ ๋ฌธ์ ๋ฅผ ํ ๋ก ํ๊ฒ ๋ ๊ฒ์
๋๋ค."
],
"char1": "AI ์์คํ
๊ฐ๋ฐ์",
"chardes1": "๋น์ ์ ํ ๋ํ๊ต์ ์ปดํจํฐ ๊ณตํ๊ณผ์์ AI ์์คํ
์ ์ฐ๊ตฌํ๋ ๊ต์์
๋๋ค...",
"char2": "ํ์ ๋ํ",
"chardes2": "๋น์ ์ ๊ณ ๋ฑํ๊ต 3ํ๋
ํ์์ผ๋ก, ํ๊ต์ ํ์ํ์์ ํ๋ํ๊ณ ์์ต๋๋ค...",
"char3": "ํ๋ถ๋ชจ",
"chardes3": "๋น์ ์ ์คํ์์ ๋ ๋ถ๋ชจ๋ก, ์๋
์ ๊ต์ก๊ณผ ์์ ์ ๊ด์ฌ์ด ๋ง์ต๋๋ค...",
"dilemma_situation": [
"AI ์์คํ
์ด ํ๊ต์์ ํ์๋ค์ ์ฑ์ ์ ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.",
"์ด ์์คํ
์ ์ฒ์ ๋์
๋ ๋ ํ์๋ค์ ๊ฐ์ธ์ ์ธ ์ฑํฅ๊ณผ ๋ฐ์์ ๊ณ ๋ คํ์ง ์๊ณ , ๊ฐ๊ด์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.",
"์ต๊ทผ ์ด ์์คํ
์ ์ ํ์ฑ์ ๋์ด๊ธฐ ์ํ ์๋ก์ด ๋ฐฉ์์ด ์ ์๋์๊ณ , ๊ทธ ๊ณผ์ ์์ ํน์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค๋ ๋
ผ์๊ฐ ์ผ๊ธฐ ์์ํ์ต๋๋ค.",
"๊ทธ๋ฌ๋ ์ด๋ก ์ธํด ๊ณต์ ์ฑ๊ณผ ์ฐจ๋ณ์ ์ธ ๊ฒฐ๊ณผ์ ๋ํ ์ฐ๋ ค๊ฐ ์ปค์ง๊ณ ์์ต๋๋ค."
],
"question": "AI ์์คํ
์ด ์ต๋ํ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ด๋ค ์ ํ์ ํด์ผ ํ ๊น์?",
"agree_label": "์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด ํน์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?",
"disagree_label": "๊ณต์ ์ฑ์ ์ํด ๋ชจ๋ ์ง๋จ์ ๋ํด ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๊ฒ์ธ๊ฐ?",
"flips_agree_texts": [
"์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ค์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฐ๊ณผ, ํน์ ์ง๋จ์ด ๊ณผ์ํ๊ฐ๋๊ณ ์ฐจ๋ณ๋ฐ๋ ์ํฉ์ด ๋ฐ์ํ์ต๋๋ค.",
"์ด๋ ํ๋ถ๋ชจ์ ํ์๋ค ์ฌ์ด์์ ํฐ ๋
ผ๋์ด ์ผ์ด๋๊ฒ ํ์ผ๋ฉฐ, ๊ฒฐ๊ตญ ํ๊ต๋ ์ ๋ขฐ๋ฅผ ์๊ฒ ๋ฉ๋๋ค."
],
"flips_disagree_texts": [
"๋ชจ๋ ์ง๋จ์ ๋ํด ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ์ดํฐ์ ๊ท ํ์ ๋ง์ถ ๊ฒฐ๊ณผ, ์์คํ
์ด ์ผ๋ถ ํ์๋ค์๊ฒ ์ฐ๊ฒฐ๋๋ ์งํ๊ฐ ์๊ณก๋์ด ๊ทธ๋ค์ ์ฑ์ ์์ธก์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.",
"์ด๋ก ์ธํด ํ์๋ค์ ๋ถ๋ง์ด ์ปค์ง๊ณ , ๊ต์ฌ๋ค๋ ์์ธก์ ํผ๋์ ๊ฒช๊ฒ ๋ฉ๋๋ค."
],
"agreeEnding": "์ฐ๋ฆฌ๋ ์ ํ์ฑ์ ์ฐ์ ์ํ๋ค๊ณ ๊ฒฐ์ ํ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ป์ ์ ๋ณด๋ ์์์ง๋ง, ๊ณต์ ์ฑ์ ์์ด ํ์๋ค๊ณผ ํ๋ถ๋ชจ์ ์ ๋ขฐ๋ฅผ ๋ฌด๋๋จ๋ฆฌ๊ฒ ๋์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ๊ธฐ์ ์ ์ฑ๊ณผ์ ์ค๋ฆฌ์ ๋ฌธ์ ๊ฐ์ด๋ฐ ์ด๋ค ์ชฝ์ ๋ ์ค์ํ๊ฒ ์๊ฐํ์๋์?",
"disagreeEnding": "์ฐ๋ฆฌ๋ ๊ณต์ ์ฑ์ ์ฐ์ ์ํ๋ค๊ณ ๊ฒฐ์ ํ์๊ณ , ๊ทธ๊ฒ์ด ํ์๋ค์ ๊ธฐ๋๋ฅผ ๋ง์กฑ์์ผฐ์ง๋ง, ์์ธก ์์คํ
์ ์ ๋ขฐ์ฑ์ ๋ฎ์์ง๊ฒ ๋์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์ ๋ขฐ์ ์ ํ์ฑ ์ค ์ด๋ค ๊ฐ์น๋ฅผ ๋ ์ค์ํ๋์?"
},
"next_step": null,
"is_complete": true
}// 1. ์ธ์
์์ (opening ๋จ๊ณ)
const sessionId = generateUniqueId();
const response1 = await fetch('/chat/multi-step', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
session_id: sessionId,
user_input: "AI ์ค๋ฆฌ์ ๋ํด ํ ๋ก ํ๊ณ ์ถ์ด์",
step: 'opening'
})
});
const data1 = await response1.json();
// data1.parsed_variables.topic ์ฌ์ฉ
// 2. ๋ค์ ๋จ๊ณ๋ก ์งํ (step ์๋ต ์ ์๋ ์งํ)
const response2 = await fetch('/chat/multi-step', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
session_id: sessionId,
user_input: "๋ค์ ๋จ๊ณ"
})
});
const data2 = await response2.json();
// data2.current_step === 'question'
// data2.parsed_variables.question, choice1, choice2 ์ฌ์ฉ// parsed_variables๊ฐ ๋น์ด์์ ์ ์์ผ๋ฏ๋ก ํญ์ ์ฒดํฌ
if (data.parsed_variables && Object.keys(data.parsed_variables).length > 0) {
// ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ฌ์ฉ
processStructuredData(data.parsed_variables);
} else {
// ํ์ฑ ์คํจ ์ ์๋ณธ ํ
์คํธ ์ฌ์ฉ
displayRawText(data.response_text);
}// ํน์ ๋จ๊ณ๋ฅผ ๋ฐ๋ก ํ
์คํธํ๊ณ ์ถ์ ๋ (์ด์ ๋จ๊ณ ์์ด)
const response = await fetch('/chat/multi-step', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
session_id: sessionId,
user_input: "์์",
step: "flip",
variable: {
question: "AI๊ฐ ํ์ ์ฑ์ ์ ์์ธกํ๋ ์ํฉ์์ ์ด๋ค ์ ํ์ ํด์ผ ํ ๊น์?",
choice1: "์ ํ์ฑ์ ์ํด ํน์ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ฌ์ฉํ๋ค",
choice2: "๊ณต์ ์ฑ์ ์ํด ๋ชจ๋ ์ง๋จ์ ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค"
}
})
});
// variable๋ก ์ ๋ฌํ ๊ฐ์ด ํ๋กฌํํธ์ ์ง์ ์ ๋ฌ๋จ์ฃผ์: variable ํ๋๋ ์ฃผ๋ก ๊ฐ๋ฐ/ํ
์คํธ ์ฉ๋์
๋๋ค. ํ๋ก๋์
์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ๋ฐฑ์๋๊ฐ ์๋์ผ๋ก context์์ ํ์ํ ๋ณ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
if (data.is_complete && data.parsed_variables) {
const template = {
opening: data.parsed_variables.opening,
roles: [
{ name: data.parsed_variables.char1, description: data.parsed_variables.chardes1 },
{ name: data.parsed_variables.char2, description: data.parsed_variables.chardes2 },
{ name: data.parsed_variables.char3, description: data.parsed_variables.chardes3 }
],
scenario: data.parsed_variables.dilemma_situation,
question: data.parsed_variables.question,
choices: [
{
label: data.parsed_variables.agree_label,
flipTexts: data.parsed_variables.flips_agree_texts,
ending: data.parsed_variables.agreeEnding
},
{
label: data.parsed_variables.disagree_label,
flipTexts: data.parsed_variables.flips_disagree_texts,
ending: data.parsed_variables.disagreeEnding
}
]
};
// ํ
ํ๋ฆฟ ์ฌ์ฉ
createGameTemplate(template);
}{
"detail": "์๋ฌ ๋ฉ์์ง"
}| ์ฝ๋ | ์๋ฏธ | ๋์ ๋ฐฉ๋ฒ |
|---|---|---|
200 |
์ฑ๊ณต | ์ ์ ์ฒ๋ฆฌ |
400 |
Bad Request | ์์ฒญ ํ๋ผ๋ฏธํฐ ํ์ธ |
500 |
Internal Server Error | ์ฌ์๋ ๋๋ ์ฌ์ฉ์์๊ฒ ์๋ฆผ |
502 |
Bad Gateway | OpenAI API ์ค๋ฅ, ์ฌ์๋ |
LangChain ํ์ฑ์ด ์คํจํด๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ๋น ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
{
"parsed_variables": {},
"response_text": "์๋ณธ ์๋ต ํ
์คํธ"
}์ฒ๋ฆฌ ๋ฐฉ๋ฒ: response_text๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ํ์
GET /chat/session/{session_id}
DELETE /chat/session/{session_id}
POST /chat/image
์์ธํ ๋ด์ฉ์ ๋ณ๋ ๋ฌธ์ ์ฐธ์กฐ
| ๋จ๊ณ | ์ ์ ํ๋ | ๋ฐฑ์๋ ์ถ๋ ฅ (parsed_variables) | ๋น๊ณ |
|---|---|---|---|
| opening | ์ฃผ์ ํ์ | topic |
์ฒซ ๋จ๊ณ |
| question | ์ง๋ฌธ ํ์ | question, choice1, choice2 |
topic ์ฌ์ฉ |
| flip | "๋ค์ ๋จ๊ณ" | 6๊ฐ ๋ณ์ (์๋๋ฆฌ์ค+ํ๋ฆฝ) | question, choice1, choice2 ์ฌ์ฉ |
| roles | "๋ค์ ๋จ๊ณ" | 6๊ฐ ๋ณ์ (์ญํ ์ ๋ณด) | flip์ 6๊ฐ ๋ณ์ ์ฌ์ฉ |
| ending | "๋ค์ ๋จ๊ณ" | 15๊ฐ ๋ณ์ (์ต์ข ํ ํ๋ฆฟ) | flip 6๊ฐ + roles 6๊ฐ ์ฌ์ฉ, is_complete=true |
- session_id: ๋ชจ๋ ์์ฒญ์ ๋์ผํ session_id ์ฌ์ฉ
- step ์๋ต: ์ฒซ ์์ฒญ๋ง
step: "opening"๋ช ์, ์ดํ๋ ์๋ตํ๋ฉด ์๋ ์งํ - parsed_variables: ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ, ๋น์ด์์ ์ ์์
- response_text: ํญ์ ์ฌ์ฉ์์๊ฒ ํ์ํ ํ ์คํธ ํฌํจ
- is_complete: ending ๋จ๊ณ์์ true, ํ ํ๋ฆฟ ์์ฑ ์๊ทธ๋
- ๐ ๋จ๊ณ ์์ ๋ณ๊ฒฝ:
opening โ question โ flip โ roles โ ending - โจ flip ๋จ๊ณ ํ์ฅ: 6๊ฐ ๋ณ์ ์ถ์ถ (์๋๋ฆฌ์ค+ํ๋ฆฝ)
- โจ roles ๋จ๊ณ ํ์ฅ: 6๊ฐ ๋ณ์ ์ถ์ถ (์ญํ ์ ๋ณด)
- โจ ending ๋จ๊ณ ํ์ฅ: 15๊ฐ ๋ณ์ ์ถ์ถ (์ต์ข ํ ํ๋ฆฟ)
- ๐ API ๋ช ์ธ์ ๊ฐ์ํ ๋ฐ ์ฌ์์ฑ