m97j commited on
Commit
361d672
Β·
1 Parent(s): d856372

Initial commit

Browse files
Files changed (3) hide show
  1. README.md +14 -0
  2. app.py +21 -9
  3. templates/index.html +104 -0
README.md CHANGED
@@ -113,4 +113,18 @@ ai-server/
113
  ### πŸ”— ν…ŒμŠ€νŠΈ
114
  μ—…λ°μ΄νŠΈ μ˜ˆμ •
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  ---
 
113
  ### πŸ”— ν…ŒμŠ€νŠΈ
114
  μ—…λ°μ΄νŠΈ μ˜ˆμ •
115
 
116
+ ---
117
+
118
+ <!-- app-tab:start -->
119
+ # πŸ‘€ PersonaChatEngine AI Server
120
+
121
+ κ²Œμž„ λ‚΄ NPC λŒ€ν™” μ—”μ§„ API μ„œλ²„μž…λ‹ˆλ‹€.
122
+ μ΅œμ†Œ μž…λ ₯λ§ŒμœΌλ‘œλ„ λ™μž‘ν•˜λ©°, RAG 기반 λ¬Έμ„œμ™€ NPC 메타데이터λ₯Ό ν™œμš©ν•΄ λŒ€ν™”λ₯Ό λ³΄κ°•ν•©λ‹ˆλ‹€.
123
+
124
+ ### βš™οΈ μ£Όμš” κΈ°λŠ₯
125
+ - κ²Œμž„ μ„œλ²„ μš”μ²­ μˆ˜μ‹  및 μ „μ²˜λ¦¬
126
+ - 쑰건 νŒμ • ν›„ 메인/폴백 λͺ¨λΈ μΆ”λ‘ 
127
+ - RAG 기반 세계관·상황·NPC 성격 반영
128
+ - 응닡 ν›„μ²˜λ¦¬ 및 JSON ν‘œμ€€ 응닡 λ°˜ν™˜
129
+ <!-- app-tab:end -->
130
  ---
app.py CHANGED
@@ -1,8 +1,11 @@
1
  import asyncio
 
 
2
  from fastapi import FastAPI, Request, HTTPException
3
  from fastapi.middleware.cors import CORSMiddleware
4
- from fastapi.responses import HTMLResponse
5
  from contextlib import asynccontextmanager
 
6
  from manager.dialogue_manager import handle_dialogue
7
  from rag.rag_manager import chroma_initialized, load_game_docs_from_disk, add_docs, set_embedder
8
  from models.model_loader import load_fallback_model, load_embedder
@@ -13,7 +16,8 @@ from config import (
13
  HF_TOKEN, BASE_DIR
14
  )
15
 
16
- model_ready = False # λͺ¨λΈ λ‘œλ”© μƒνƒœ ν”Œλž˜κ·Έ
 
17
 
18
  async def load_models(app: FastAPI):
19
  global model_ready
@@ -39,7 +43,7 @@ async def load_models(app: FastAPI):
39
 
40
  @asynccontextmanager
41
  async def lifespan(app: FastAPI):
42
- asyncio.create_task(load_models(app)) # λ°±κ·ΈλΌμš΄λ“œ λ‘œλ”©
43
  yield
44
  print("πŸ›‘ μ„œλ²„ μ’…λ£Œ 쀑...")
45
 
@@ -54,12 +58,19 @@ app.add_middleware(
54
  )
55
 
56
  @app.get("/", include_in_schema=False)
57
- async def root():
58
- return HTMLResponse("""
59
- <h1>Persona Chat Engine API</h1>
60
- <p>μ„œλ²„κ°€ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.</p>
61
- <p><a href="/docs">Swagger UI둜 이동</a></p>
62
- """)
 
 
 
 
 
 
 
63
 
64
  @app.get("/status")
65
  async def status():
@@ -95,6 +106,7 @@ async def ask(request: Request, req: AskReq):
95
  )
96
 
97
 
 
98
  '''
99
  μ΅œμ’… game‑server β†’ ai‑server μš”μ²­ μ˜ˆμ‹œ
100
  {
 
1
  import asyncio
2
+ from pathlib import Path
3
+ import markdown
4
  from fastapi import FastAPI, Request, HTTPException
5
  from fastapi.middleware.cors import CORSMiddleware
6
+ from fastapi.templating import Jinja2Templates
7
  from contextlib import asynccontextmanager
8
+
9
  from manager.dialogue_manager import handle_dialogue
10
  from rag.rag_manager import chroma_initialized, load_game_docs_from_disk, add_docs, set_embedder
11
  from models.model_loader import load_fallback_model, load_embedder
 
16
  HF_TOKEN, BASE_DIR
17
  )
18
 
19
+ templates = Jinja2Templates(directory="templates")
20
+ model_ready = False
21
 
22
  async def load_models(app: FastAPI):
23
  global model_ready
 
43
 
44
  @asynccontextmanager
45
  async def lifespan(app: FastAPI):
46
+ asyncio.create_task(load_models(app))
47
  yield
48
  print("πŸ›‘ μ„œλ²„ μ’…λ£Œ 쀑...")
49
 
 
58
  )
59
 
60
  @app.get("/", include_in_schema=False)
61
+ async def root(request: Request):
62
+ md_path = Path(__file__).parent / "README.md"
63
+ md_content = md_path.read_text(encoding="utf-8")
64
+
65
+ start_tag = "<!-- app-tab:start -->"
66
+ end_tag = "<!-- app-tab:end -->"
67
+ if start_tag in md_content and end_tag in md_content:
68
+ short_md = md_content.split(start_tag)[1].split(end_tag)[0].strip()
69
+ else:
70
+ short_md = md_content # fallback: 전체 λ‚΄μš©
71
+
72
+ html_from_md = markdown.markdown(short_md)
73
+ return templates.TemplateResponse("index.html", {"request": request, "readme_content": html_from_md})
74
 
75
  @app.get("/status")
76
  async def status():
 
106
  )
107
 
108
 
109
+
110
  '''
111
  μ΅œμ’… game‑server β†’ ai‑server μš”μ²­ μ˜ˆμ‹œ
112
  {
templates/index.html ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>PersonaChatEngine AI Server</title>
6
+ <style>
7
+ /* 닀크λͺ¨λ“œ κΈ°λ³Έ μŠ€νƒ€μΌ */
8
+ body {
9
+ font-family: 'Segoe UI', Arial, sans-serif;
10
+ margin: 0;
11
+ background-color: #0d1117;
12
+ color: #e6edf3;
13
+ }
14
+ header {
15
+ background-color: #161b22;
16
+ padding: 20px 40px;
17
+ text-align: center;
18
+ border-bottom: 1px solid #30363d;
19
+ }
20
+ header h1 {
21
+ margin: 0;
22
+ font-size: 1.8em;
23
+ background: linear-gradient(90deg, #58a6ff, #a371f7);
24
+ -webkit-background-clip: text;
25
+ -webkit-text-fill-color: transparent;
26
+ }
27
+ header p {
28
+ margin: 5px 0 0;
29
+ color: #8b949e;
30
+ }
31
+ main {
32
+ max-width: 900px;
33
+ margin: 40px auto;
34
+ background-color: #161b22;
35
+ padding: 30px;
36
+ border-radius: 12px;
37
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
38
+ border: 1px solid #30363d;
39
+ }
40
+ h1, h2, h3 {
41
+ color: #58a6ff;
42
+ }
43
+ p, ul {
44
+ line-height: 1.6;
45
+ }
46
+ ul {
47
+ padding-left: 20px;
48
+ }
49
+ /* λ²„νŠΌ μŠ€νƒ€μΌ */
50
+ a.button {
51
+ display: inline-block;
52
+ margin: 15px 10px 0 0;
53
+ padding: 12px 20px;
54
+ background: linear-gradient(135deg, #58a6ff, #a371f7);
55
+ color: white;
56
+ text-decoration: none;
57
+ border-radius: 8px;
58
+ font-weight: bold;
59
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
60
+ box-shadow: 0 4px 14px rgba(88, 166, 255, 0.4);
61
+ }
62
+ a.button:hover {
63
+ transform: translateY(-2px);
64
+ box-shadow: 0 6px 20px rgba(88, 166, 255, 0.6);
65
+ }
66
+ .button-container {
67
+ display: flex;
68
+ justify-content: center;
69
+ gap: 25px;
70
+ margin-top: 20px;
71
+ }
72
+
73
+ footer {
74
+ text-align: center;
75
+ font-size: 0.85em;
76
+ color: #8b949e;
77
+ margin: 40px 0 20px;
78
+ }
79
+ /* 링크 색상 */
80
+ a {
81
+ color: #58a6ff;
82
+ }
83
+ a:hover {
84
+ text-decoration: underline;
85
+ }
86
+ </style>
87
+ </head>
88
+ <body>
89
+ <header>
90
+ <h1>PersonaChatEngine AI Server</h1>
91
+ <p>κ²Œμž„ λ‚΄ NPC λŒ€ν™” μ—”μ§„ API</p>
92
+ </header>
93
+ <main>
94
+ {{ readme_content|safe }}
95
+ <div class="button-container">
96
+ <a class="button" href="/docs" target="_blank">πŸš€ API ν…ŒμŠ€νŠΈν•˜κΈ°</a>
97
+ <a class="button" href="https://huggingface.co/spaces/m97j/PersonaChatEngine_ai_server/blob/main/README.md" target="_blank">πŸ“„ 상세 λ¬Έμ„œ 보기</a>
98
+ </div>
99
+ </main>
100
+ <footer>
101
+ &copy; 2025 PersonaChatEngine Project
102
+ </footer>
103
+ </body>
104
+ </html>