Files
AIclinicalresearch/docs/09-架构实施/04-平台基础设施规划.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

22 KiB
Raw Blame History

蟷ウ蜿ー蝓コ遑€隶セ譁ス隗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>latform Infrastructure Plan<61>?

*<EFBFBD>。」迚域悽<EFBFBD>? V1.0
*蛻帛サコ譌・譛滂シ? 2025-11-16
*騾ら畑蟇ケ雎。<EFBFBD>? 譫カ譫<EFBDB6>ク医€∝錘遶ッ蠑€蜿代€∬ソ千サ? <EFBFBD>。」迥カ諤<EFBFBD><EFBFBD> 螳樊命隗<E591BD><E99A97>
扈エ謚、閠<EFBFBD><EFBFBD> 譫カ譫<EFBDB6>屬髦<E5B1AC>


<EFBFBD>搭 譁<>。」隸エ譏<EFBDB4>

譛ャ譁<EFBFBD>。」譏ッ螢ケ隸∝セェAI遘醍<EFBFBD>泌ケウ蜿ー逧?*蟷ウ蜿ー蝓コ遑€隶セ譁ス隗<EFBDBD><E99A97><EFBFBD>。」**<2A>悟ョ壻ケ我コ<E68891>シ?

  1. **譬ク蠢<EFBDB8>怙豎?*<2A>壼ケウ蜿ー蝓コ遑€隶セ譁ス髴€隕∬ァ」蜀ウ逧<EFBDB3>琉鬚<E79089>
  2. 隶セ隶。譁ケ譯<EFBFBD><EFBFBD>壽橿譛ッ譫カ譫<EFBFBD>柱螳樒鴫譁ケ譯<EFBFBD>
  3. 螳樊命隶。蛻<EFBFBD><EFBFBD><EFBFBD>髦カ谿オ逧<EFBFBD>ョ樊命霍ッ郤ソ蝗セ
  4. 鬪梧噺譬<EFBFBD><EFBFBD>壽ッ丈クェ讓。蝮礼噪鬪梧噺譬<EFBFBD>

*譬ク蠢<EFBFBD>岼譬<EFBFBD>シ?

  • 笨?謾ッ謖∵悽蝨ー蠑€蜿大柱莠醍ォッ驛ィ鄂イ譌<EFBDB2>郛晏<E9839B>謐「
  • 笨?謾ッ謖 ̄RD螳壻ケ臥<EFBDB9>?遘埼Κ鄂イ蠖「諤<EFBDA2>シ井コ醍ォッSaaS縲∫ァ∵怏蛹悶€∝黒譛コ迚医€∵キキ蜷茨シ<E88CA8>
  • 笨?謾ッ謖∵ィ。蝮怜喧扈<E596A7>粋蜚ョ蜊厄シ井ク謎ク夂沿縲<E6B2BF>ォ倡コァ迚医€∵覧闊ー迚茨シ?
  • 笨?謠蝉セ幃€夂畑閭ス蜉幢シ梧園譛我ク壼苅讓。蝮礼峩謗・螟咲<E89E9F>?

<EFBFBD>識 髴€豎りレ譎?

1. 荳壼苅髴€豎ゑシ域擂閾ェPRD<52>?

譬ケ謐ョ 09-諤サ菴馴怙豎よ枚譯?PRD).md.md)<29>悟ケウ蜿ー蠢<EFBDB0>。サ謾ッ謖<EFBDAF><EFBFBD>

€<EFBFBD>D 髴€豎よ緒霑? €譛ッ謖第<EFBFBD>?
NFR-1.1 莠醍ォッSaaS迚茨シ亥、夂ァ滓姐縲<EFBFBD>ォ伜庄逕ィ<EFBFBD>? Serverless譫カ譫<EFBFBD>€<EFBFBD>蜉ィ謇ゥ郛ゥ螳ケ
NFR-1.2 遘∵怏蛹夜Κ鄂イ<EFBFBD>域焚謐ョ荳榊<EFBFBD><EFBFBD>ス托シ? 譛ャ蝨ー蟄伜お縲∵悽蝨ー謨ー謐ョ蠎<EFBFBD>
NFR-1.3 蜊墓惻迚茨シ<EFBFBD>100%譛ャ蝨ー蛹厄シ<E58E84> 遖サ郤ソ霑占。後€∵悽蝨ー譁<EFBFBD>サカ邉サ扈?
NFR-1.4 豺キ蜷磯Κ鄂イ<EFBFBD>Κ<EFBFBD>悽蝨?驛ィ蛻<EFBDA8>コ醍ォッ<EFBDAB>? 轣オ豢サ逧<EFBFBD><EFBFBD>鄂ョ蛻<EFBFBD><EFBFBD>?
NFR-2.1 SaaS螟夂沿譛ャ<EFBFBD>井ク謎ク夂沿縲<EFBFBD>ォ倡コァ迚医€∵覧闊ー迚茨シ? Feature Flag縲∵ィ。蝮怜喧
NFR-2.2 讓。蝮怜喧蜚ョ蜊厄シ井ササ菴墓ィ。蝮怜庄迢ャ遶句醗蜊厄シ<EFBFBD> 譚セ閠ヲ蜷域楔譫<EFBFBD>
NFR-2.3 AI謌先悽蜿ッ謗ァ<EFBFBD>亥勘諤∝<EFBFBD>謐「LLM<EFBFBD>? 騾る<EFBFBD>蝎ィ讓。蠑?

2. 謚€譛ッ髴€豎ゑシ域擂閾ェ莠大次逕滓楔譫<E6A594><EFBFBD>

譬ケ謐ョ莠大次逕滄Κ鄂イ譫カ譫<EFBFBD>シ磯仭驥御コ?Serverless + RDS + OSS<53>会シ悟ケウ蜿ー蠢<EFBDB0>。サ<EFBDA1>?

謚€譛ッ髴€豎? 隸エ譏<EFBFBD> 莨伜<EFBFBD>郤?
*<EFBFBD>迥カ諤∝コ皮<EFBFBD>? 荳堺セ晁オ匁悽蝨ー譁<EFBFBD>サカ邉サ扈滓<EFBFBD><EFBFBD>ュ倡憾諤? P0
蟄伜お謚ス雎。 謾ッ謖∵悽蝨ー蟄伜お蜥薫SS譌<EFBFBD>郛晏<EFBFBD>謐「 P0
謨ー謐ョ蠎楢ソ樊磁豎<EFBFBD> 髦イ豁「Serverless謇ゥ螳ケ蟇シ閾エ霑樊磁謨ー雜<EFBFBD><EFBFBD>? P0
*<EFBFBD>㊥蛹匁律蠢? 霎灘<EFBFBD>蛻ーstdout<EFBFBD>梧髪謖<EFBFBD>寔荳ュ謾カ髮? P0
蠑よュ・莉サ蜉。 髟ソ譌カ髣エ莉サ蜉。蠢<EFBFBD>。サ蠑よュ・螟<EFBFBD><EFBFBD>磯∩蜈崎カ<EFBFBD><EFBFBD>? P0
*<EFBFBD><EFBFBD>シ冗シ灘ュ? 螟壼ョ樔セ句<EFBFBD>莠ォ郛灘ュ? P1
*蛛・蠎キ譽€譟? SAE蟄俶エサ蜥悟ーア扈ェ譽€譟? P1
逶第而謖<EFBFBD><EFBFBD><EFBFBD> 謨ー謐ョ蠎楢ソ樊磁謨ー縲∽ササ蜉。髦溷<EFBFBD><EFBFBD> P1

<EFBFBD><EFBFBD>?隶セ隶。譁ケ譯<EFBDB9>

譬ク蠢<EFBFBD>ョセ隶。蜴溷<EFBFBD>

蟷ウ蜿ー蝓コ遑€隶セ譁ス騾夊ソ<EFBFBD>€<EFBFBD>蝎ィ讓。蠑擾シ<EFBFBD>dapter Pattern<72>牙ョ樒鴫螟夂識蠅<E8AD98>髪謖<E9ABAA>

笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?                  荳壼苅讓。蝮怜ア?                            笏?
笏?  ASL | AIA | PKB | DC | SSA | ST | UAM                笏?
笏?  蜿ェ蜈ウ豕ィ荳壼苅騾サ霎托シ悟、咲畑蟷ウ蜿ー閭ス蜉?                           笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
                    竊?import from '@/common/'
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?             蟷ウ蜿ー蝓コ遑€隶セ譁ス螻ゑシ<E38291>dapter Pattern<72>?           笏?
笏懌楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?蟄伜お<E4BC9C>哭ocalAdapter 竊絶<E7AB8A> OSSAdapter                        笏?
笏?郛灘ュ假シ哺emoryCacheAdapter 竊絶<E7AB8A> RedisCacheAdapter           笏?
笏?莉サ蜉。<E89C89>哺emoryQueueAdapter 竊絶<E7AB8A> DatabaseQueueAdapter        笏?
笏?譌・蠢暦シ咾onsoleLogger 竊絶<E7AB8A> 髦ソ驥御コ全LS                         笏?
笏?謨ー謐ョ蠎難シ壽悽蝨ーPostgreSQL 竊絶<E7AB8A> 髦ソ驥御コ然DS<44>郁ソ樊磁豎<E7A381><E8B18E>?           笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
                    竊?邇ッ蠅<EFBDAF>序驥丞<E9A9A5>謐「
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?        驛ィ鄂イ邇ッ蠅<EFBDAF>シ磯峺莉」遐∵隼蜉ィ<E89C89>?                           笏?
笏? 譛ャ蝨ー蠑€蜿?| 莠醍ォッSaaS | 遘∵怏蛹夜Κ鄂?| 蜊墓惻迚?              笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?

<EFBFBD>逃 蟷ウ蜿ー蝓コ遑€隶セ譁ス讓。蝮玲ク<E78EB2>

讓。蝮玲€サ隗<EFBFBD>

讓。蝮<EFBFBD> 霍ッ蠕<EFBFBD> 莨伜<EFBFBD>郤? 隸エ譏<EFBFBD>
蟄伜お譛榊苅 common/storage/ P0 <EFBFBD>サカ荳贋シ<EFBFBD>荳玖スス<EFBFBD>域悽蝨?OSS<53>?
謨ー謐ョ蠎楢ソ樊磁豎<EFBFBD> config/database.ts P0 Prisma霑樊磁豎<EFBFBD>驟咲ス?
譌・蠢礼ウサ扈<EFBFBD> common/logging/ P0 <EFBFBD>㊥蛹匁律蠢苓セ灘<EFBFBD>?
邇ッ蠅<EFBFBD><EFBFBD>鄂ョ config/env.ts P0 邇ッ蠅<EFBFBD>序驥冗ョ。逅<EFBFBD>
蠑よュ・莉サ蜉。 common/jobs/ P0 髟ソ譌カ髣エ莉サ蜉。蠑よュ・螟<EFBFBD><EFBFBD>?
郛灘ュ俶恪蜉。 common/cache/ P1 <EFBFBD><EFBFBD>シ冗シ灘ュ?
*蛛・蠎キ譽€譟? common/health/ P1 SAE蛛・蠎キ譽€譟・遶ッ轤?
逶第而謖<EFBFBD><EFBFBD><EFBFBD> common/monitoring/ P1 蜈ウ髞ョ謖<EFBFBD><EFBFBD><EFBFBD>尅謗ァ

<EFBFBD>盗 隸ヲ扈<EFBDA6>ョセ隶。

1. 蟄伜お譛榊苅<E6A68A><E88B85>torage Service<63>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?謾ッ謖∵悽蝨ー蠑€蜿托シ<E68998>ocalAdapter<65>?
  • 笨?謾ッ謖∽コ醍ォッ驛ィ鄂イ<E98482><EFBDB2>SSAdapter<65>?
  • 笨?荳壼苅莉」遐<EFBDA3>峺謾ケ蜉ィ蛻<EFBDA8><E89BBB>?

逶ョ蠖慕サ捺桷

backend/src/common/storage/
笏懌楳笏€ StorageAdapter.ts      # 謗・蜿」螳壻ケ<E5A3BB>
笏懌楳笏€ LocalAdapter.ts        # 譛ャ蝨ー螳樒鴫
笏懌楳笏€ OSSAdapter.ts          # OSS螳樒鴫
笏懌楳笏€ StorageFactory.ts      # 蟾・蜴らア?
笏披楳笏€ index.ts               # 扈滉ク€蟇シ蜃コ

謗・蜿」螳壻ケ<EFBFBD>

// backend/src/common/storage/StorageAdapter.ts
export interface StorageAdapter {
  upload(key: string, buffer: Buffer): Promise<string>
  download(key: string): Promise<Buffer>
  delete(key: string): Promise<void>
  getUrl(key: string): string
}

邇ッ蠅<EFBFBD><EFBFBD>謐「

# 譛ャ蝨ー蠑€蜿?
STORAGE_TYPE=local

# 逕滉コァ邇ッ蠅<EFBDAF>
STORAGE_TYPE=oss
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-prod

荳壼苅讓。蝮嶺スソ逕ィ

import { storage } from '@/common/storage'

// 菴ソ逕ィ<E98095>井ク榊<EFBDB8><EFBFBD>悽蝨ー霑俶弍OSS<53>?
const url = await storage.upload('literature/123.pdf', buffer)

2. 謨ー謐ョ蠎楢ソ樊磁豎<E7A381><E8B18E><EFBFBD>atabase Connection Pool<6F>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?髦イ豁「Serverless謇ゥ螳ケ蟇シ閾エ霑樊磁謨ー雜<EFBDB0><E99B9C>?
  • 笨?莨倬寉蜈ウ髣ュ霑樊磁
  • 笨?霑樊磁謨ー逶第<E980B6>?

<EFBFBD>サカ菴咲スョ

backend/src/config/database.ts

霑樊磁豎<EFBFBD>驟咲ス?

// 隶。邂怜<E98282>蠑擾シ壽ッ丞ョ樔セ玖ソ樊磁謨?= RDS譛€螟ァ霑樊磁謨ー / SAE譛€螟ァ螳樔セ区焚
// 遉コ萓具シ?00霑樊磁 / 20螳樔セ<E6A894> = 20霑樊磁/螳樔セ<E6A894>

import { PrismaClient } from '@prisma/client'

const connectionLimit = Math.floor(
  Number(process.env.DB_MAX_CONNECTIONS || 400) / 
  Number(process.env.MAX_INSTANCES || 20)
)

export const prisma = new PrismaClient({
  log: process.env.NODE_ENV === 'development' ? ['query', 'error'] : ['error'],
})

// 莨倬寉蜈ウ髣ュ
process.on('SIGTERM', async () => {
  await prisma.$disconnect()
  process.exit(0)
})

邇ッ蠅<EFBFBD>序驥<EFBFBD>

DB_MAX_CONNECTIONS=400      # RDS譛€螟ァ霑樊磁謨ー
MAX_INSTANCES=20            # SAE譛€螟ァ螳樔セ区焚
DATABASE_URL=postgresql://...

3. 譌・蠢礼ウサ扈滂シ<E6BB82>ogging<6E>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?莠大次逕滂シ壼宵霎灘<E99C8E>蛻ーstdout<75>井ク榊<EFBDB8>譛ャ蝨ー譁<EFBDB0>サカ<EFBDBB><EFBDB6>
  • 笨?JSON譬シ蠑擾シ井セソ莠朱仭驥御コ全LS隗」譫撰シ?
  • 笨?扈滉ク€<C280>律蠢玲<E8A0A2>シ蠑?

逶ョ蠖慕サ捺桷

backend/src/common/logging/
笏懌楳笏€ logger.ts              # 譌・蠢怜キ・蜈キ
笏披楳笏€ index.ts               # 蟇シ蜃コ

螳樒鴫

// backend/src/common/logging/logger.ts
import winston from 'winston'

export const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  defaultMeta: {
    service: 'aiclinical-backend',
    env: process.env.NODE_ENV,
    instance: process.env.HOSTNAME
  },
  transports: [
    new winston.transports.Console({
      format: winston.format.json()  // 箝?JSON譬シ蠑<EFBDBC>
    })
  ]
})

荳壼苅讓。蝮嶺スソ逕ィ

import { logger } from '@/common/logging'

logger.info('Screening started', { projectId, count: 100 })
logger.error('LLM API failed', { error: err.message })

4. 邇ッ蠅<EFBDAF><E8A085>鄂ョ<E98482><EFBDAE>nvironment Config<69>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?扈滉ク€<C280><E980A7>鄂ョ邂。逅?
  • 笨?譛ャ蝨ー蠑€蜿托シ<E68998>.env譁<76>サカ
  • 笨?逕滉コァ邇ッ蠅<EFBDAF>シ售AE邇ッ蠅<EFBDAF>序驥<E5BA8F>
  • 笨?蜷ッ蜉ィ譌カ鬪瑚ッ∝ソ<E2889D>怙驟咲スョ

<EFBFBD>サカ菴咲スョ

backend/src/config/env.ts

螳樒鴫

// backend/src/config/env.ts
import { config } from 'dotenv'

// 蜿ェ蝨ィ譛ャ蝨ー蠑€蜿大刈霓?.env 譁<>サカ
if (process.env.NODE_ENV !== 'production') {
  config()
}

export const env = {
  // 蠎皮畑驟咲スョ
  NODE_ENV: process.env.NODE_ENV || 'development',
  PORT: Number(process.env.PORT) || 3001,
  
  // 謨ー謐ョ蠎馴<E8A08E>鄂?
  DATABASE_URL: process.env.DATABASE_URL!,
  DB_MAX_CONNECTIONS: Number(process.env.DB_MAX_CONNECTIONS) || 400,
  MAX_INSTANCES: Number(process.env.MAX_INSTANCES) || 20,
  
  // 蟄伜お驟咲スョ
  STORAGE_TYPE: process.env.STORAGE_TYPE || 'local',
  OSS_REGION: process.env.OSS_REGION,
  OSS_BUCKET: process.env.OSS_BUCKET,
  
  // 郛灘ュ倬<EFBDAD>鄂ョ
  CACHE_TYPE: process.env.CACHE_TYPE || 'memory',
  REDIS_HOST: process.env.REDIS_HOST,
  
  // LLM驟咲スョ
  DEEPSEEK_API_KEY: process.env.DEEPSEEK_API_KEY,
  QWEN_API_KEY: process.env.QWEN_API_KEY,
  
  // 蜉溯<E89C89>€蜈?
  ENABLED_MODULES: process.env.ENABLED_MODULES?.split(',') || [],
}

// 蜷ッ蜉ィ譌カ鬪瑚ッ?
export function validateEnv() {
  const required = ['DATABASE_URL']
  for (const key of required) {
    if (!process.env[key]) {
      throw new Error(`Missing required env var: ${key}`)
    }
  }
}

5. 蠑よュ・莉サ蜉。<E89C89><EFBDA1>sync Jobs<62>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?髟ソ譌カ髣エ莉サ蜉。<E89C89><EFBDA1>>10遘抵シ牙シよュ・螟<EFBDA5>
  • 笨?驕ソ蜈拘erverless雜<73><EFBFBD>?0遘抵シ<E68AB5>
  • 笨?謾ッ謖∬ソ帛コヲ譟・隸「

逶ョ蠖慕サ捺桷

backend/src/common/jobs/
笏懌楳笏€ JobQueue.ts            # 莉サ蜉。髦溷<E9ABA6>謗・蜿」
笏懌楳笏€ MemoryQueue.ts         # 譛ャ蝨ー蠑€蜿托シ亥<EFBDBC>蟄倬弌蛻暦シ?
笏懌楳笏€ DatabaseQueue.ts       # 逕滉コァ邇ッ蠅<EFBDAF>シ域焚謐ョ蠎馴弌蛻暦シ?
笏懌楳笏€ JobProcessor.ts        # 莉サ蜉。螟<EFBDA1>炊蝎?
笏披楳笏€ index.ts

謗・蜿」螳壻ケ<EFBFBD>

// backend/src/common/jobs/JobQueue.ts
export interface Job<T = any> {
  id: string
  type: string
  data: T
  status: 'pending' | 'processing' | 'completed' | 'failed'
  progress: number
  result?: any
  error?: string
  createdAt: Date
  updatedAt: Date
}

export interface JobQueue {
  push<T>(type: string, data: T): Promise<Job<T>>
  process<T>(type: string, handler: (job: Job<T>) => Promise<void>): void
  getJob(id: string): Promise<Job | null>
  updateProgress(id: string, progress: number): Promise<void>
}

荳壼苅讓。蝮嶺スソ逕ィ<EFBFBD><EFBFBD>SL讓。蝮礼、コ萓具シ?

import { jobQueue } from '@/common/jobs'

// 1. 蛻帛サコ莉サ蜉。<E89C89>育ォ句叉霑泌屓<E6B38C><E5B193>
app.post('/screening/start', async (req, res) => {
  const job = await jobQueue.push('asl:screening', {
    projectId: req.body.projectId,
    literatureIds: req.body.literatureIds
  })
  
  res.send({ jobId: job.id })  // 箝?遶句叉霑泌屓<E6B38C>御ク咲ュ牙セ<E78999>ョ梧<EFBDAE>
})

// 2. 譟・隸「霑帛コヲ
app.get('/screening/jobs/:id', async (req, res) => {
  const job = await jobQueue.getJob(req.params.id)
  res.send({
    status: job.status,
    progress: job.progress,  // 0-100
    result: job.result
  })
})

// 3. 螟<>炊莉サ蜉。<E89C89>亥錘蜿ー<E89CBF><EFBDB0>
jobQueue.process('asl:screening', async (job) => {
  const { projectId, literatureIds } = job.data
  
  for (let i = 0; i < literatureIds.length; i++) {
    await screenLiterature(literatureIds[i])
    await jobQueue.updateProgress(job.id, (i + 1) / literatureIds.length * 100)
  }
})

6. 郛灘ュ俶恪蜉。<E89C89><EFBDA1>ache Service<63>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?謾ッ謖∵悽蝨ー蠑€蜿托シ<E68998>emoryCacheAdapter<65>?
  • 笨?謾ッ謖∫函莠ァ邇ッ蠅<EFBDAF><EFBFBD>edisCacheAdapter<65>?
  • 笨?螟壼ョ樔セ句<EFBDBE>莠ォ郛灘ュ?

逶ョ蠖慕サ捺桷

backend/src/common/cache/
笏懌楳笏€ CacheAdapter.ts        # 謗・蜿」螳壻ケ<E5A3BB>
笏懌楳笏€ MemoryCacheAdapter.ts  # 譛ャ蝨ー螳樒鴫
笏懌楳笏€ RedisCacheAdapter.ts   # Redis螳樒鴫
笏懌楳笏€ CacheFactory.ts        # 蟾・蜴らア?
笏披楳笏€ index.ts

謗・蜿」螳壻ケ<EFBFBD>

export interface CacheAdapter {
  get<T>(key: string): Promise<T | null>
  set(key: string, value: any, ttl?: number): Promise<void>
  delete(key: string): Promise<void>
  clear(): Promise<void>
}

邇ッ蠅<EFBFBD><EFBFBD>謐「

# 譛ャ蝨ー蠑€蜿?
CACHE_TYPE=memory

# 逕滉コァ邇ッ蠅<EFBDAF>
CACHE_TYPE=redis
REDIS_HOST=r-***.redis.aliyuncs.com

7. 蛛・蠎キ譽€譟・<E8AD9F><EFBDA5>ealth Check<63>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?SAE蟄俶エサ譽€譟・<E8AD9F><EFBDA5>/health/liveness<73>?
  • 笨?SAE蟆ア扈ェ譽€譟・<E8AD9F><EFBDA5>/health/readiness<73>?
  • 笨?譽€譟・萓晁オ匁恪蜉。<E89C89>域焚謐ョ蠎難シ<E99BA3>

逶ョ蠖慕サ捺桷

backend/src/common/health/
笏懌楳笏€ healthCheck.ts
笏披楳笏€ index.ts

螳樒鴫

import { FastifyInstance } from 'fastify'
import { prisma } from '@/config/database'

export async function registerHealthRoutes(app: FastifyInstance) {
  // 蟄俶エサ譽€譟?
  app.get('/health/liveness', async () => {
    return { status: 'ok', timestamp: Date.now() }
  })
  
  // 蟆ア扈ェ譽€譟?
  app.get('/health/readiness', async () => {
    try {
      await prisma.$queryRaw`SELECT 1`
      return {
        status: 'ready',
        checks: { database: 'ok' }
      }
    } catch (error) {
      return {
        status: 'not_ready',
        checks: { database: 'failed' }
      }
    }
  })
}

8. 逶第而謖<E8808C><E8AC96><EFBFBD><EFBFBD>onitoring<6E>?

隶セ隶。逶ョ譬<EFBFBD>

  • 笨?謨ー謐ョ蠎楢ソ樊磁謨ー逶第而
  • 笨?蜈ウ髞ョ謖<EFBDAE><E8AC96><EFBFBD>相隴ヲ

逶ョ蠖慕サ捺桷

backend/src/common/monitoring/
笏懌楳笏€ metrics.ts
笏披楳笏€ index.ts

螳樒鴫

import { prisma } from '@/config/database'
import { logger } from '@/common/logging'
import { env } from '@/config/env'

export class Metrics {
  static async recordDBConnectionCount() {
    const result = await prisma.$queryRaw`
      SELECT count(*) as count 
      FROM pg_stat_activity 
      WHERE datname = current_database()
    `
    
    const count = result[0].count
    logger.info('DB connection count', { count })
    
    // 蜻願ュヲ<EFBDAD>夊ソ樊磁謨ー雜<EFBDB0>ソ<EFBFBD>80%
    if (count > env.DB_MAX_CONNECTIONS * 0.8) {
      logger.warn('DB connection pool near limit', {
        current: count,
        max: env.DB_MAX_CONNECTIONS
      })
    }
    
    return count
  }
}

<EFBFBD>套 螳樊命隶。蛻<EFBDA1>

諤サ菴捺慮髣エ隗<EFBFBD><EFBFBD>

*<EFBFBD>ョ。諤サ閠玲慮<EFBFBD>?.5螟ゥ<EFBFBD><EFBFBD>20蟆乗慮<EFBFBD>?

Day 1: 譬ク蠢<EFBDB8>渕遑€隶セ譁ス<E8AD81><EFBDBD>0讓。蝮暦シ?        8蟆乗慮
Day 2: 霎<>勧蝓コ遑€隶セ譁ス<E8AD81><EFBDBD>1讓。蝮暦シ? 豬玖ッ<E78E96>   8蟆乗慮
Day 3: 譁<>。」譖エ譁ー                      4蟆乗慮

Day 1<><EFBFBD>ク蠢<EFBDB8>渕遑€隶セ譁ス<E8AD81><EFBDBD>0讓。蝮暦シ?

荳雁壕<EFBFBD>?蟆乗慮<E4B997>?

*Task 1.1<EFBFBD>壼ュ伜お譛榊苅<EFBFBD><EFBFBD>2蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/storage/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 StorageAdapter.ts<EFBFBD>域磁蜿」螳壻ケ会シ<EFBFBD>
  • 螳樒鴫 LocalAdapter.ts<EFBFBD>域悽蝨ー螳樒鴫<EFBFBD><EFBFBD>
  • 螳樒鴫 OSSAdapter.ts<EFBFBD><EFBFBD>SS螳樒鴫<EFBFBD>碁「<EFBFBD><EFBFBD><EFBFBD>
  • 螳樒鴫 StorageFactory.ts<EFBFBD>亥キ・蜴らアサ<EFBFBD>?
  • 蛻帛サコ index.ts<EFBFBD>育サ滉ク€蟇シ蜃コ<EFBFBD>?

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?LocalAdapter 蜿ッ豁」蟶?upload/download
  • 笨?騾夊ソ<E5A48A>識蠅<E8AD98>序驥<E5BA8F> STORAGE_TYPE<>
  • 笨?蜊募<E89C8A>豬玖ッ暮€夊ソ<E5A48A>

*Task 1.2<EFBFBD>壽焚謐ョ蠎楢ソ樊磁豎<EFBFBD><EFBFBD><EFBFBD>2蟆乗慮<EFBFBD>?

  • 譖エ譁ー backend/src/config/database.ts
  • 豺サ蜉<EFBFBD>霑樊磁豎<EFBFBD>驟咲ス?
  • 豺サ蜉<EFBFBD>莨倬寉蜈ウ髣ュ騾サ霎<EFBFBD>
  • 豺サ蜉<EFBFBD>邇ッ蠅<EFBFBD>序驥城ェ瑚ッ<EFBFBD>

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?Prisma Client 豁」遑ョ驟咲スョ霑樊磁豎?
  • 笨?蜷ッ蜉ィ譌カ鬪瑚ッ∫識蠅<E8AD98>序驥?
  • 笨?SIGTERM菫。蜿キ莨倬寉蜈ウ髣ュ

荳句壕<EFBFBD>?蟆乗慮<E4B997>?

*Task 1.3<EFBFBD>壽律蠢礼ウサ扈滂シ<EFBFBD>2蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/logging/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 logger.ts<EFBFBD><EFBFBD>inston驟咲スョ<EFBFBD>?
  • 驟咲スョJSON譬シ蠑剰セ灘<EFBFBD>
  • 蛻帛サコ index.ts<EFBFBD>亥ッシ蜃コ<EFBFBD><EFBFBD>

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?譌・蠢苓セ灘<EFBDBE>蛻ーstdout<75><74>SON譬シ蠑擾シ?
  • 笨?蛹<>性timestamp縲《ervice縲nv遲牙<E981B2>菫。諱ッ
  • 笨?謾ッ謖∽ク榊酔譌・蠢礼コァ蛻ォ<E89BBB><EFBDAB>nfo/warn/error<6F>?

*Task 1.4<EFBFBD>壼シよュ・莉サ蜉。<EFBFBD><EFBFBD>2蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/jobs/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 JobQueue.ts<EFBFBD>域磁蜿」螳壻ケ会シ<EFBFBD>
  • 螳樒鴫 MemoryQueue.ts<EFBFBD><EFBFBD>蟄倬弌蛻暦シ<EFBFBD>
  • 螳樒鴫 DatabaseQueue.ts<EFBFBD>域焚謐ョ蠎馴弌蛻暦シ碁「<EFBFBD><EFBFBD><EFBFBD>
  • 螳樒鴫 JobProcessor.ts<EFBFBD>井ササ蜉。螟<EFBFBD>炊蝎ィ<EFBFBD>?

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?蜿ッ蛻帛サコ莉サ蜉。蟷カ遶句叉霑泌屓
  • 笨?蜿ッ譟・隸「莉サ蜉。霑帛コ?
  • 笨?蜿ッ蝨ィ蜷主床螟<E5BA8A>炊莉サ蜉。

Day 2<>夊セ<E5A48A>勧蝓コ遑€隶セ譁ス<E8AD81><EFBDBD>1讓。蝮暦シ? 豬玖ッ<E78E96>

荳雁壕<EFBFBD>?蟆乗慮<E4B997>?

*Task 2.1<EFBFBD>夂識蠅<EFBFBD><EFBFBD>鄂ョ<EFBFBD><EFBFBD>1蟆乗慮<EFBFBD>?

  • 譖エ譁ー backend/src/config/env.ts
  • 扈滉ク€邇ッ蠅<EFBFBD>序驥丞ョ壻ケ<EFBFBD>
  • 豺サ蜉<EFBFBD>蜷ッ蜉ィ鬪瑚ッ∝<EFBFBD>謨ー

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?謇€譛臥識蠅<E8AD98>序驥城寔荳ュ邂。逅?
  • 笨?蜷ッ蜉ィ譌カ閾ェ蜉ィ鬪瑚ッ∝ソ<E2889D>怙驟咲スョ
  • 笨?謾ッ謖∵悽蝨ー蠑€蜿大柱逕滉コァ邇ッ蠅<EFBDAF>

*Task 2.2<EFBFBD>夂シ灘ュ俶恪蜉。<EFBFBD><EFBFBD>2蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/cache/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 CacheAdapter.ts<EFBFBD>域磁蜿」螳壻ケ会シ<EFBFBD>
  • 螳樒鴫 MemoryCacheAdapter.ts<EFBFBD><EFBFBD>蟄伜ョ樒鴫<EFBFBD><EFBFBD>
  • 螳樒鴫 RedisCacheAdapter.ts<EFBFBD><EFBFBD>edis螳樒鴫<EFBFBD>碁「<EFBFBD><EFBFBD><EFBFBD>
  • 螳樒鴫 CacheFactory.ts<EFBFBD>亥キ・蜴らアサ<EFBFBD>?

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?MemoryCacheAdapter 蜿ッ豁」蟶?get/set
  • 笨?騾夊ソ<E5A48A>識蠅<E8AD98>序驥丞<E9A9A5>謐「
  • 笨?謾ッ謖ゝTL霑<4C>

*Task 2.3<EFBFBD>壼▼蠎キ譽€譟・<EFBFBD><EFBFBD>1蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/health/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 healthCheck.ts
  • 豕ィ蜀<EFBFBD> /health/liveness 遶ッ轤ケ
  • 豕ィ蜀<EFBFBD> /health/readiness 遶ッ轤ケ

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?liveness遶ッ轤ケ豁」蟶ク霑泌屓
  • 笨?readiness遶ッ轤ケ譽€譟・謨ー謐ョ蠎楢ソ樊磁
  • 笨?髞呵ッッ譌カ霑泌屓豁」遑ョ迥カ諤?

荳句壕<EFBFBD>?蟆乗慮<E4B997>?

*Task 2.4<EFBFBD>夂尅謗ァ謖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1蟆乗慮<EFBFBD>?

  • 蛻帛サコ backend/src/common/monitoring/ 逶ョ蠖<EFBDAE>
  • 螳樒鴫 metrics.ts
  • 螳樒鴫謨ー謐ョ蠎楢ソ樊磁謨ー逶第而
  • 螳樒鴫蜻願ュヲ騾サ霎<EFBFBD>

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?蜿ッ譟・隸「謨ー謐ョ蠎楢ソ樊磁謨?
  • 笨?霑樊磁謨ー雜<EFBDB0>ソ?0%譌カ蜻願ュ?
  • 笨?譌・蠢苓セ灘<EFBDBE>豁」遑ョ

*Task 2.5<EFBFBD>夐寔謌先オ玖ッ包シ<EFBFBD>3蟆乗慮<EFBFBD>?

  • 郛門<EFBFBD>蟄伜お譛榊苅蜊募<EFBFBD>豬玖ッ<EFBFBD>
  • 郛門<EFBFBD>譌・蠢礼ウサ扈溷黒蜈<EFBFBD>オ玖ッ<EFBFBD>
  • 郛門<EFBFBD>郛灘ュ俶恪蜉。蜊募<EFBFBD>豬玖ッ<EFBFBD>
  • 郛門<EFBFBD>蠑よュ・莉サ蜉。蜊募<EFBFBD>豬玖ッ<EFBFBD>
  • <EFBFBD><EFBFBD>豬玖ッ包シ域園譛画ィ。蝮暦シ<EFBFBD>

鬪梧噺譬<EFBFBD><EFBFBD>?

  • 笨?謇€譛牙黒蜈<E9BB92>オ玖ッ暮€夊ソ<E5A48A>
  • 笨?髮<><E9ABAE>豬玖ッ暮€夊ソ<E5A48A>
  • 笨?莉」遐∬ヲ<E288AC>尠邇?> 80%

Day 3<>壽枚譯」譖エ譁?

荳雁壕<EFBFBD>?蟆乗慮<E4B997>?

*Task 3.1<EFBFBD>壽峩譁ー譫カ譫<EFBFBD>枚譯」<EFBFBD><EFBFBD>2蟆乗慮<EFBFBD>?

  • 譖エ譁ー 01-邉サ扈滓楔譫<E6A594><E8ADAB>螻りョセ隶。.md
    • 蝨?蟷ウ蜿ー蝓コ遑€螻?遶<>闃ゆクュ隸ヲ扈<EFBDA6>喧蜷<E596A7>恪蜉?
    • 豺サ蜉<EFBFBD>騾る<EFBFBD>蝎ィ讓。蠑剰ッエ譏?
  • 譖エ譁ー 蜑榊錘遶ッ讓。蝮怜喧譫カ譫<EFBFBD>ョセ隶。-V2.md
    • 譖エ譁ー backend 逶ョ蠖慕サ捺桷
    • 菴鍋鴫譁ー蠅樒<EFBFBD>?common/ 蟄先ィ。蝮?

*Task 3.2<EFBFBD>壽峩譁ー螳樊命譁<EFBFBD>。」<EFBFBD><EFBFBD>1蟆乗慮<EFBFBD>?

  • 譖エ譁ー 09-譫カ譫<EFBDB6>ョ樊命/03-莠大次逕滄Κ鄂イ譫カ譫<EFBDB6>欠蜊?md
    • 豺サ蜉<EFBFBD>蟷ウ蜿ー蝓コ遑€隶セ譁ス遶<EFBFBD><EFBFBD>
    • 譖エ譁ー邇ッ蠅<EFBFBD>序驥城<EFBFBD>鄂ョ遉コ萓<EFBFBD>

*Task 3.3<EFBFBD>夂ョ€蛹泡SL譁<EFBFBD>。」<EFBFBD>?蟆乗慮<E4B997>?

  • 譖エ譁ー 03-荳壼苅讓。蝮<EFBDA1>/ASL-AI譎コ閭ス譁<EFBDBD>鍵/04-蠑€蜿題ョ。蛻?02-譬<>「俶遭隕∝<E99A95>遲帛シ€蜿題ョ。蛻?md
    • 遘サ髯、"蛻帛サコ蟄伜お謚ス雎。螻?莉サ蜉。
    • 豺サ蜉<EFBFBD>"蜑咲スョ譚。莉カ<E88E89>壼ケウ蜿ー蟾イ謠蝉セ<E89D89>"
  • 譖エ譁ー 03-荳壼苅讓。蝮<EFBDA1>/ASL-AI譎コ閭ス譁<EFBDBD>鍵/04-蠑€蜿題ョ。蛻?03-莉サ蜉。蛻<EFBDA1>ァ」.md
    • 遘サ髯、蟄伜お謚ス雎。螻ゆササ蜉?
    • 譖エ譁ー鬪梧噺譬<EFBFBD>

<EFBFBD>識 鬪梧噺譬<E599BA>

諤サ菴馴ェ梧噺譬<EFBFBD>

  • **蜉溯<E89C89>螳梧紛諤?*<2A>壽園譛臼0讓。蝮怜ョ樒鴫螳梧<E89EB3>
  • 豬玖ッ戊ヲ<EFBFBD><EFBFBD>壼黒蜈<EFBFBD>オ玖ッ戊ヲ<EFBFBD>尠邇<EFBFBD> > 80%
  • **譁<>。」螳梧紛諤?*<2A>壽園譛画楔譫<E6A594>枚譯」譖エ譁ー螳梧<E89EB3>?
  • **螟夂識蠅<E8AD98>髪謖?*<2A>壽悽蝨ー蠑€蜿大柱莠醍ォッ驛ィ鄂イ鬪瑚ッ<E7919A>€夊ソ<E5A48A>
  • 荳壼苅讓。蝮鈴ェ瑚ッ<EFBFBD><EFBFBD>哂SL讓。蝮怜庄豁」蟶ク菴ソ逕ィ蟷ウ蜿ー閭ス蜉?

邇ッ蠅<EFBFBD>ェ瑚ッ∫洸髦オ

鬪瑚ッ<EFBFBD>。? 譛ャ蝨ー蠑€蜿? 莠醍ォッSaaS 遘∵怏蛹夜Κ鄂? 蜊墓惻迚?
蟄伜お譛榊苅 笨?LocalAdapter 笨?OSSAdapter 笨?LocalAdapter 笨?LocalAdapter
謨ー謐ョ蠎楢ソ樊<EFBFBD>? 笨?譛ャ蝨ーPostgreSQL 笨?髦ソ驥御コ然DS 笨?蜀<>ス善ostgreSQL 笨?SQLite
郛灘ュ俶恪蜉。 笨?Memory 笨?Redis 笨?蜀<>ス然edis 笨?Memory
譌・蠢礼ウサ扈<EFBFBD> 笨?Console 笨?髦ソ驥御コ全LS 笨?Console 笨?Console
蠑よュ・莉サ蜉。 笨?MemoryQueue 笨?DatabaseQueue 笨?DatabaseQueue 笨?MemoryQueue
蛛・蠎キ譽€譟? 笨?OK 笨?OK 笨?OK N/A

<EFBFBD>噫 螳樊命蜷守噪謾カ逶<EFBDB6>

1. 蠑€蜿第譜邇<E8AD9C>署蜊?

<EFBFBD><EFBFBD><EFBFBD> 謾ケ騾<EFBFBD><EFBFBD> 謾ケ騾<EFBFBD><EFBFBD> 謠仙合
荳壼苅讓。蝮怜シ€蜿第慮髣? 髴€隕∝ョ樒鴫蟄伜お遲牙渕遑€隶セ譁ス 逶エ謗・菴ソ逕ィ蟷ウ蜿ー閭ス蜉<EFBFBD> 闃ら怐30%
譁ー讓。蝮嶺ク頑焔譌カ髣? €隕∝ュヲ荵<EFBFBD>蝓コ遑€隶セ譁ス 蜿ェ髴€蜈ウ豕ィ荳壼苅騾サ霎<EFBFBD> 闃ら怐50%
莉」遐∝、咲畑邇? 豈丈クェ讓。蝮鈴㍾螟榊ョ樒鴫 €譛画ィ。蝮怜、咲<EFBFBD>? 謠仙合80%

2. 驛ィ鄂イ轣オ豢サ諤?

驛ィ鄂イ蠖「諤? 謾ッ謖∵ュ蜀オ <EFBFBD>困謌先悽
莠醍ォッSaaS 笨?螳悟<E89EB3>謾ッ謖<EFBDAF> 菫ョ謾ケ邇ッ蠅<EFBFBD>序驥<EFBFBD>
遘∵怏蛹夜Κ鄂? 笨?螳悟<E89EB3>謾ッ謖<EFBDAF> 菫ョ謾ケ邇ッ蠅<EFBFBD>序驥<EFBFBD>
蜊墓惻迚? 笨?螳悟<E89EB3>謾ッ謖<EFBDAF> 菫ョ謾ケ邇ッ蠅<EFBFBD>序驥<EFBFBD>
豺キ蜷磯Κ鄂イ 笨?螳悟<E89EB3>謾ッ謖<EFBDAF> 謖画ィ。蝮鈴<EFBFBD>鄂?

3. 蝠<>ク壽ィ。蠑冗<E8A091>豢サ諤?

<EFBFBD>ク壽ィ。蠑<EFBFBD> 謾ッ謖∵ュ蜀オ
荳謎ク夂沿<EFBFBD>Κ<EFBFBD>ィ。蝮暦シ? 笨?Feature Flag謗ァ蛻カ
鬮倡コァ迚茨シ育サ<EFBFBD>粋讓。蝮暦シ? 笨?Feature Flag謗ァ蛻カ
譌苓芦迚茨シ亥<EFBFBD>驛ィ讓。蝮暦シ? 笨?Feature Flag謗ァ蛻カ
蜊墓ィ。蝮怜醗蜊? 笨?Docker髟懷ワ蛻<E383AF><EFBFBD>

4. 謚€譛ッ蛟コ蜉。髯堺ス<E5A0BA>

  • 笨?驕ソ蜈埼㍾螟堺サ」遐<EFBDA3>
  • 笨?扈滉ク€<C280>楔譫<E6A594>」取<EFBDA3>?
  • 笨?譏謎コ守サエ謚、蜥悟合郤?
  • 笨?譁ー莠コ蠢ォ騾滉ク頑<EFBDB8>?

<EFBFBD>答 逶ク蜈ウ譁<EFBDB3>。」


<EFBFBD>統 蜿俶峩隶ー蠖<EFBDB0>

譌・譛<EFBFBD> 迚域悽 蜿俶峩蜀<EFBFBD>ョケ 蜿俶峩莠?
2025-11-16 V1.0 蛻晏ァ狗沿譛ャ<EFBFBD>悟ョ壻ケ牙ケウ蜿ー蝓コ遑€隶セ譁ス隗<EFBFBD><EFBFBD> 譫カ譫<EFBFBD>屬髦<EFBFBD>

<EFBFBD>。」扈捺據