malek-messaoudii
commited on
Commit
·
c508ed0
1
Parent(s):
682062a
refactor: Remove GenerateArgumentRequest and GenerateArgumentResponse models; update generate_argument endpoint to accept topic and position parameters.
Browse files- models/__init__.py +0 -2
- models/mcp_models.py +0 -12
- routes/mcp_routes.py +38 -40
- services/mcp_service.py +11 -3
models/__init__.py
CHANGED
|
@@ -40,7 +40,6 @@ from .mcp_models import (
|
|
| 40 |
MatchKeypointResponse,
|
| 41 |
TranscribeAudioResponse,
|
| 42 |
GenerateSpeechResponse,
|
| 43 |
-
GenerateArgumentResponse,
|
| 44 |
)
|
| 45 |
|
| 46 |
__all__ = [
|
|
@@ -71,5 +70,4 @@ __all__ = [
|
|
| 71 |
"MatchKeypointResponse",
|
| 72 |
"TranscribeAudioResponse",
|
| 73 |
"GenerateSpeechResponse",
|
| 74 |
-
"GenerateArgumentResponse",
|
| 75 |
]
|
|
|
|
| 40 |
MatchKeypointResponse,
|
| 41 |
TranscribeAudioResponse,
|
| 42 |
GenerateSpeechResponse,
|
|
|
|
| 43 |
)
|
| 44 |
|
| 45 |
__all__ = [
|
|
|
|
| 70 |
"MatchKeypointResponse",
|
| 71 |
"TranscribeAudioResponse",
|
| 72 |
"GenerateSpeechResponse",
|
|
|
|
| 73 |
]
|
models/mcp_models.py
CHANGED
|
@@ -77,18 +77,6 @@ class GenerateSpeechResponse(BaseModel):
|
|
| 77 |
|
| 78 |
audio_path: str = Field(..., description="Path to generated audio file")
|
| 79 |
|
| 80 |
-
class GenerateArgumentResponse(BaseModel):
|
| 81 |
-
"""Response model for argument generation"""
|
| 82 |
-
model_config = ConfigDict(
|
| 83 |
-
json_schema_extra={
|
| 84 |
-
"example": {
|
| 85 |
-
"argument": "Climate change is a pressing issue that requires immediate action..."
|
| 86 |
-
}
|
| 87 |
-
}
|
| 88 |
-
)
|
| 89 |
-
|
| 90 |
-
argument: str = Field(..., description="Generated debate argument")
|
| 91 |
-
|
| 92 |
class ResourceInfo(BaseModel):
|
| 93 |
"""Information about an MCP resource"""
|
| 94 |
uri: str
|
|
|
|
| 77 |
|
| 78 |
audio_path: str = Field(..., description="Path to generated audio file")
|
| 79 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
class ResourceInfo(BaseModel):
|
| 81 |
"""Information about an MCP resource"""
|
| 82 |
uri: str
|
routes/mcp_routes.py
CHANGED
|
@@ -15,9 +15,10 @@ from models.mcp_models import (
|
|
| 15 |
DetectStanceResponse,
|
| 16 |
MatchKeypointResponse,
|
| 17 |
TranscribeAudioResponse,
|
| 18 |
-
GenerateSpeechResponse
|
| 19 |
-
GenerateArgumentResponse
|
| 20 |
)
|
|
|
|
|
|
|
| 21 |
|
| 22 |
router = APIRouter(prefix="/api/v1/mcp", tags=["MCP"])
|
| 23 |
logger = logging.getLogger(__name__)
|
|
@@ -77,18 +78,6 @@ class GenerateSpeechRequest(BaseModel):
|
|
| 77 |
}
|
| 78 |
}
|
| 79 |
|
| 80 |
-
class GenerateArgumentRequest(BaseModel):
|
| 81 |
-
"""Request pour générer un argument"""
|
| 82 |
-
user_input: str = Field(..., description="Input utilisateur pour générer l'argument")
|
| 83 |
-
conversation_id: Optional[str] = Field(default=None, description="ID de conversation (optionnel)")
|
| 84 |
-
|
| 85 |
-
class Config:
|
| 86 |
-
json_schema_extra = {
|
| 87 |
-
"example": {
|
| 88 |
-
"user_input": "Generate an argument about climate change",
|
| 89 |
-
"conversation_id": "conv_123"
|
| 90 |
-
}
|
| 91 |
-
}
|
| 92 |
|
| 93 |
|
| 94 |
# ===== Routes MCP =====
|
|
@@ -171,14 +160,14 @@ async def list_mcp_tools():
|
|
| 171 |
),
|
| 172 |
ToolInfo(
|
| 173 |
name="generate_argument",
|
| 174 |
-
description="Génère un argument de débat
|
| 175 |
input_schema={
|
| 176 |
"type": "object",
|
| 177 |
"properties": {
|
| 178 |
-
"
|
| 179 |
-
"
|
| 180 |
},
|
| 181 |
-
"required": ["
|
| 182 |
}
|
| 183 |
),
|
| 184 |
ToolInfo(
|
|
@@ -431,39 +420,48 @@ async def mcp_generate_speech(request: GenerateSpeechRequest):
|
|
| 431 |
logger.error(f"Error in generate_speech: {e}")
|
| 432 |
raise HTTPException(status_code=500, detail=f"Error executing tool generate_speech: {e}")
|
| 433 |
|
| 434 |
-
@router.post("/tools/generate-argument", response_model=
|
| 435 |
-
async def mcp_generate_argument(request:
|
| 436 |
-
"""Génère un argument de débat
|
| 437 |
try:
|
| 438 |
result = await mcp_server.call_tool("generate_argument", {
|
| 439 |
-
"
|
| 440 |
-
"
|
| 441 |
})
|
| 442 |
|
| 443 |
-
# Extraire
|
| 444 |
-
|
| 445 |
if isinstance(result, dict):
|
| 446 |
if "result" in result and isinstance(result["result"], list) and len(result["result"]) > 0:
|
| 447 |
content_block = result["result"][0]
|
| 448 |
-
if hasattr(content_block, 'text'):
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
generated_argument = result
|
| 454 |
-
elif isinstance(result, (list, tuple)) and len(result) > 0:
|
| 455 |
-
if hasattr(result[0], 'text'):
|
| 456 |
-
generated_argument = result[0].text
|
| 457 |
else:
|
| 458 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 459 |
else:
|
| 460 |
-
|
|
|
|
|
|
|
|
|
|
| 461 |
|
| 462 |
-
|
| 463 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 464 |
|
| 465 |
-
|
| 466 |
-
logger.info(f"Argument generated: {len(generated_argument)} characters")
|
| 467 |
return response
|
| 468 |
|
| 469 |
except HTTPException:
|
|
|
|
| 15 |
DetectStanceResponse,
|
| 16 |
MatchKeypointResponse,
|
| 17 |
TranscribeAudioResponse,
|
| 18 |
+
GenerateSpeechResponse
|
|
|
|
| 19 |
)
|
| 20 |
+
from models.generate import GenerateRequest, GenerateResponse
|
| 21 |
+
from datetime import datetime
|
| 22 |
|
| 23 |
router = APIRouter(prefix="/api/v1/mcp", tags=["MCP"])
|
| 24 |
logger = logging.getLogger(__name__)
|
|
|
|
| 78 |
}
|
| 79 |
}
|
| 80 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
|
| 83 |
# ===== Routes MCP =====
|
|
|
|
| 160 |
),
|
| 161 |
ToolInfo(
|
| 162 |
name="generate_argument",
|
| 163 |
+
description="Génère un argument de débat pour un topic et une position donnés",
|
| 164 |
input_schema={
|
| 165 |
"type": "object",
|
| 166 |
"properties": {
|
| 167 |
+
"topic": {"type": "string", "description": "Le sujet du débat"},
|
| 168 |
+
"position": {"type": "string", "description": "La position à prendre (positive ou negative)"}
|
| 169 |
},
|
| 170 |
+
"required": ["topic", "position"]
|
| 171 |
}
|
| 172 |
),
|
| 173 |
ToolInfo(
|
|
|
|
| 420 |
logger.error(f"Error in generate_speech: {e}")
|
| 421 |
raise HTTPException(status_code=500, detail=f"Error executing tool generate_speech: {e}")
|
| 422 |
|
| 423 |
+
@router.post("/tools/generate-argument", response_model=GenerateResponse, summary="Générer un argument de débat")
|
| 424 |
+
async def mcp_generate_argument(request: GenerateRequest):
|
| 425 |
+
"""Génère un argument de débat pour un topic et une position donnés"""
|
| 426 |
try:
|
| 427 |
result = await mcp_server.call_tool("generate_argument", {
|
| 428 |
+
"topic": request.topic,
|
| 429 |
+
"position": request.position
|
| 430 |
})
|
| 431 |
|
| 432 |
+
# Extraire les données du résultat MCP
|
| 433 |
+
parsed_result = None
|
| 434 |
if isinstance(result, dict):
|
| 435 |
if "result" in result and isinstance(result["result"], list) and len(result["result"]) > 0:
|
| 436 |
content_block = result["result"][0]
|
| 437 |
+
if hasattr(content_block, 'text') and content_block.text:
|
| 438 |
+
try:
|
| 439 |
+
parsed_result = json.loads(content_block.text)
|
| 440 |
+
except json.JSONDecodeError:
|
| 441 |
+
raise HTTPException(status_code=500, detail="Invalid JSON response from MCP tool")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 442 |
else:
|
| 443 |
+
parsed_result = result
|
| 444 |
+
elif isinstance(result, (list, tuple)) and len(result) > 0:
|
| 445 |
+
if hasattr(result[0], 'text') and result[0].text:
|
| 446 |
+
try:
|
| 447 |
+
parsed_result = json.loads(result[0].text)
|
| 448 |
+
except json.JSONDecodeError:
|
| 449 |
+
raise HTTPException(status_code=500, detail="Invalid JSON response from MCP tool")
|
| 450 |
else:
|
| 451 |
+
parsed_result = result
|
| 452 |
+
|
| 453 |
+
if not parsed_result:
|
| 454 |
+
raise HTTPException(status_code=500, detail="Empty response from MCP tool")
|
| 455 |
|
| 456 |
+
# Construire la réponse structurée
|
| 457 |
+
response = GenerateResponse(
|
| 458 |
+
topic=parsed_result.get("topic", request.topic),
|
| 459 |
+
position=parsed_result.get("position", request.position),
|
| 460 |
+
argument=parsed_result.get("argument", ""),
|
| 461 |
+
timestamp=datetime.now().isoformat()
|
| 462 |
+
)
|
| 463 |
|
| 464 |
+
logger.info(f"Argument generated for topic '{request.topic}' with position '{request.position}': {len(response.argument)} characters")
|
|
|
|
| 465 |
return response
|
| 466 |
|
| 467 |
except HTTPException:
|
services/mcp_service.py
CHANGED
|
@@ -10,7 +10,7 @@ from services.stance_model_manager import stance_model_manager
|
|
| 10 |
from services.label_model_manager import kpa_model_manager
|
| 11 |
from services.stt_service import speech_to_text
|
| 12 |
from services.tts_service import text_to_speech
|
| 13 |
-
from services.
|
| 14 |
|
| 15 |
logger = logging.getLogger(__name__)
|
| 16 |
|
|
@@ -51,8 +51,16 @@ def generate_speech(text: str, voice: str = "Aaliyah-PlayAI", format: str = "wav
|
|
| 51 |
return text_to_speech(text, voice, format)
|
| 52 |
|
| 53 |
@mcp_server.tool()
|
| 54 |
-
def generate_argument(
|
| 55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
@mcp_server.resource("debate://prompt")
|
| 58 |
def get_debate_prompt() -> str:
|
|
|
|
| 10 |
from services.label_model_manager import kpa_model_manager
|
| 11 |
from services.stt_service import speech_to_text
|
| 12 |
from services.tts_service import text_to_speech
|
| 13 |
+
from services.generate_model_manager import generate_model_manager
|
| 14 |
|
| 15 |
logger = logging.getLogger(__name__)
|
| 16 |
|
|
|
|
| 51 |
return text_to_speech(text, voice, format)
|
| 52 |
|
| 53 |
@mcp_server.tool()
|
| 54 |
+
def generate_argument(topic: str, position: str) -> Dict[str, Any]:
|
| 55 |
+
"""Generate an argument for a given topic and position"""
|
| 56 |
+
if not generate_model_manager.model_loaded:
|
| 57 |
+
raise ValueError("Modèle de génération non chargé")
|
| 58 |
+
argument = generate_model_manager.generate(topic=topic, position=position)
|
| 59 |
+
return {
|
| 60 |
+
"topic": topic,
|
| 61 |
+
"position": position,
|
| 62 |
+
"argument": argument
|
| 63 |
+
}
|
| 64 |
|
| 65 |
@mcp_server.resource("debate://prompt")
|
| 66 |
def get_debate_prompt() -> str:
|