기능 계약
이 목록은 scripts/test-capability-contracts.mjs에서 강제됩니다. 제공자 기능은 스키마와 카탈로그 매핑, 실행 핸들러, 일치하는 브라우저 클라이언트, 명명된 UI 작업, 문서, 집중 동작 테스트, 번들 매니페스트가 모두 일치해야 완성됩니다.
| 기능 | 플러그인 유형 | 실행 경로 | 브라우저 클라이언트 | UI 작업 | 문서 | 집중 동작 테스트 | 번들 정의 |
|---|---|---|---|---|---|---|---|
| 채팅/완성 | chat, completion | WS /ws (chat_stream) | frontend/src/hooks/useChat.ts | frontend/src/pages/ChatPage.tsx — handleSendMessage | docs/08-PLUGIN_ARCHITECTURE.md | scripts/test-chat-provider-selection.mjs (test:package) — 일반 요청과 스트리밍 요청에서 정확한 플러그인 경로가 선택한 제공자에 도달하는지 검증 | anthropic, codex-oauth, gemini, github, groq, huggingface, kimi-code, llama-cpp, mistral, mlx-lm, openai, openrouter |
| 임베딩 | embedding | POST /api/ollama/embedGET /api/embeddings/models (검색 전용) | frontend/src/utils/api/modelApi.ts | frontend/src/components/ModelManager.tsx — handleGenerateEmbeddings | docs/09-RAG_FEATURE.md | scripts/test-plugin-capability-routing.mjs (test:package) — Hugging Face 기능이 일반 채팅 엔드포인트를 무시하고 작업 페이로드를 사용하는지 검증 | huggingface |
| 이미지 생성 | image | POST /api/image-gen/generate | frontend/src/utils/api/imageGenApi.ts | frontend/src/components/ImageGenerationPanel.tsx — handleGenerate | docs/38-MEDIA_GENERATION.md | scripts/test-image-generation-routing.mjs (test:package) — 이미지 생성이 선택한 제공자와 사용자 범위 OpenAI 설정을 사용하는지 검증 | comfyui, huggingface, openai, openrouter |
| 음성 인식 | stt | POST /api/stt/transcribe | frontend/src/utils/api/sttApi.ts | frontend/src/hooks/useDictation.ts — toggle | docs/42-SPEECH_TO_TEXT.md | scripts/test-stt-routing.mjs (test:package) — STT가 선택한 경로에 OpenAI 호환 multipart 요청을 보내는지 검증frontend/e2e/stt.spec.ts (test:e2e) — 제공자 음성 입력이 경로를 공개하고 녹음된 음성을 전사하는지 검증 | huggingface, openai |
| 음성 합성 | tts | POST /api/tts/generate | frontend/src/utils/api/ttsApi.ts | frontend/src/components/TTSButton.tsx — handlePlay | docs/38-MEDIA_GENERATION.md | scripts/test-tts-routing.mjs (test:package) — TTS가 공유 모델 별칭을 선택한 플러그인과 사용자 밸브를 통해 라우팅하는지 검증frontend/e2e/tts-playback.spec.ts (test:e2e) — 배치 읽어 주기가 각 배치에 선택한 저장 음성을 재사용하는지 검증 | elevenlabs, huggingface, kyutai-tts-1.6b, kyutai-tts, longcat-audiodit, openai-tts, openai, openrouter, qwen-tts |
| 오디오 생성 | audio | POST /api/media/sound/generate | frontend/src/utils/api/mediaApi.ts | frontend/src/components/MediaGenerationPanel.tsx — handleGenerate | docs/38-MEDIA_GENERATION.md | scripts/test-openrouter-media-routing.mjs (test:package) — OpenRouter 오디오 출력 모델이 생성한 사운드 바이트를 스트리밍하는지 검증 | openrouter |
| 동영상 생성 | video | POST /api/media/video/generatePOST /api/media/video/jobs/:jobId/resume | frontend/src/utils/api/mediaApi.tsfrontend/src/utils/api/mediaApi.ts | frontend/src/components/MediaGenerationPanel.tsx — handleGenerate | docs/38-MEDIA_GENERATION.md | scripts/test-openrouter-media-routing.mjs (test:package) — 동영상 생성을 제출하고 제공자 엔드포인트를 통해 폴링 및 다운로드하는지 검증scripts/test-openrouter-media-routing.mjs (test:package) — 준비된 동영상 및 재개 게시가 손실된 커밋 확인을 해결하는지 검증 | openrouter |
강제 적용
패키지 게이트는 선언되지 않은 스키마 또는 플러그인 유형, 오래된 카탈로그 매핑, 실행 기능으로 표시된 검색 전용 경로, 일치하는 브라우저 전송이 없는 핸들러, 호출과 표시 트리거가 없는 UI 작업, 기능별 설명이 없는 문서, 지정된 테스트 사례 안에 동작이 없는 테스트, 오래된 생성 목록, 잘못된 매니페스트 엔드포인트·모델 맵·기본값을 거부합니다.
임베딩 생성은 POST /api/ollama/embed를 통해 실행되며 선택한 임베딩 플러그인으로 라우팅할 수 있습니다. GET /api/embeddings/models는 모델을 나열합니다. 게이트는 이를 검색 전용으로 기록하며 임베딩 생성이 작동한다는 증거로 인정하지 않습니다.
소스 계약은 각 집중 동작 테스트와 실행기를 식별합니다. 백엔드 스크립트는 test:package에 등록되어야 하며, 프런트엔드 사양은 Playwright 기반 test:e2e 스크립트에서 검색 가능해야 합니다. 실시간 검색은 모델 카탈로그를 좁힐 수 있지만 새로운 실행 기능을 만들지는 않습니다.