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 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 à partir d'un input utilisateur",
175
  input_schema={
176
  "type": "object",
177
  "properties": {
178
- "user_input": {"type": "string", "description": "Input utilisateur pour générer l'argument"},
179
- "conversation_id": {"type": "string", "description": "ID de conversation (optionnel)"}
180
  },
181
- "required": ["user_input"]
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=GenerateArgumentResponse, summary="Générer un argument de débat")
435
- async def mcp_generate_argument(request: GenerateArgumentRequest):
436
- """Génère un argument de débat à partir d'un input utilisateur"""
437
  try:
438
  result = await mcp_server.call_tool("generate_argument", {
439
- "user_input": request.user_input,
440
- "conversation_id": request.conversation_id
441
  })
442
 
443
- # Extraire l'argument du résultat MCP
444
- generated_argument = None
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
- generated_argument = content_block.text
450
- elif "argument" in result:
451
- generated_argument = result["argument"]
452
- elif isinstance(result, str):
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
- generated_argument = str(result[0])
 
 
 
 
 
 
459
  else:
460
- generated_argument = str(result)
 
 
 
461
 
462
- if not generated_argument:
463
- raise HTTPException(status_code=500, detail="Empty argument from MCP tool")
 
 
 
 
 
464
 
465
- response = GenerateArgumentResponse(argument=generated_argument)
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.chat_service import generate_chat_response
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(user_input: str, conversation_id: str = None) -> str:
55
- return generate_chat_response(user_input, conversation_id)
 
 
 
 
 
 
 
 
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: