geronimo-pericoli commited on
Commit
8bb703e
·
verified ·
1 Parent(s): 2eb9acb

Update server.py

Browse files
Files changed (1) hide show
  1. server.py +80 -23
server.py CHANGED
@@ -76,8 +76,6 @@ for source, rel_path in SOURCES.items():
76
 
77
 
78
 
79
-
80
-
81
 
82
 
83
 
@@ -87,51 +85,110 @@ mcp = FastMCP("OnBase", port=port)
87
 
88
 
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  @mcp.resource(
91
  uri="info://available_retrievers",
92
  name="AvailableRetrievers",
93
  description="Provides information about available document retrievers including their names and descriptions.",
94
  mime_type="application/json"
95
  )
96
- def get_available_retrievers() -> dict:
97
  """
98
- Returns a mapping of available retrievers with their metadata.
99
 
100
- The structure includes:
101
- - retriever_name: The full name used to reference the retriever
102
- - source: The source system (e.g., 'oms')
103
- - index_name: The specific index name
104
- - description: Human-readable description
105
  """
106
  available_retrievers = []
107
 
108
  for full_index_name in indices.keys():
109
- # Parse the full index name (e.g., "oms_vec_1")
110
  parts = full_index_name.split('_')
111
  source = parts[0]
112
- index_name = '_'.join(parts[1:]) if len(parts) > 1 else "default"
113
 
114
- # Create a description based on the index name
115
- description = f"Documentos de {source.upper()}"
116
- if index_name.startswith("vec"):
117
- description += f" - Índice vectorial {index_name.split('_')[-1]}"
118
- elif index_name.startswith("tree"):
119
- description += f" - Índice jerárquico {index_name.split('_')[-1]}"
120
- else:
121
- description += f" - Índice {index_name}"
122
 
123
  available_retrievers.append({
124
  "retriever_name": full_index_name,
125
  "source": source,
126
- "index_name": index_name,
127
- "description": description
 
 
128
  })
129
 
 
 
 
 
 
 
130
  return {
131
  "retrievers": available_retrievers,
132
  "count": len(available_retrievers),
133
- "default_source": "oms",
134
- "default_top_k": 3
135
  }
136
 
137
 
 
76
 
77
 
78
 
 
 
79
 
80
 
81
 
 
85
 
86
 
87
 
88
+ # Configuración del archivo retrievers.json
89
+ RETRIEVERS_METADATA_PATH = Path("./retrievers.json")
90
+
91
+ # Cargar metadatos de los retrievers
92
+ def load_retrievers_metadata() -> Dict:
93
+ try:
94
+ with open(RETRIEVERS_METADATA_PATH, 'r', encoding='utf-8') as f:
95
+ return json.load(f)
96
+ except FileNotFoundError:
97
+ print(f"Warning: {RETRIEVERS_METADATA_PATH} not found. Using empty metadata.")
98
+ return {}
99
+ except json.JSONDecodeError:
100
+ print(f"Warning: {RETRIEVERS_METADATA_PATH} is invalid JSON. Using empty metadata.")
101
+ return {}
102
+
103
+ retrievers_metadata = load_retrievers_metadata()
104
+
105
+ # Resource para listar solo títulos/disponibles
106
+ @mcp.resource(
107
+ uri="info://available_retriever_titles",
108
+ name="AvailableRetrieverTitles",
109
+ description="Lista los nombres/títulos disponibles de los retrievers",
110
+ mime_type="application/json"
111
+ )
112
+ def get_retriever_titles() -> dict:
113
+ """
114
+ Devuelve una lista con los títulos/nombres de los retrievers disponibles
115
+ """
116
+ return {
117
+ "titles": list(retrievers_metadata.keys()),
118
+ "count": len(retrievers_metadata)
119
+ }
120
+
121
+ # Resource para obtener metadatos específicos
122
+ @mcp.resource(
123
+ uri="info://retriever_details/{retriever_title}",
124
+ name="RetrieverDetails",
125
+ description="Obtiene información detallada sobre un retriever específico",
126
+ mime_type="application/json"
127
+ )
128
+ def get_retriever_details(retriever_title: str) -> dict:
129
+ """
130
+ Devuelve los metadatos completos para un retriever específico
131
+
132
+ Parameters:
133
+ retriever_title: El título/nombre del retriever (ej: 'oms')
134
+ """
135
+ if retriever_title not in retrievers_metadata:
136
+ return {
137
+ "error": f"Retriever '{retriever_title}' no encontrado",
138
+ "available_titles": list(retrievers_metadata.keys())
139
+ }
140
+
141
+ return {
142
+ "retriever": retriever_title,
143
+ "details": retrievers_metadata[retriever_title]
144
+ }
145
+
146
+ # Modificación del resource existente para usar los metadatos
147
  @mcp.resource(
148
  uri="info://available_retrievers",
149
  name="AvailableRetrievers",
150
  description="Provides information about available document retrievers including their names and descriptions.",
151
  mime_type="application/json"
152
  )
153
+ def get_available_retrievers(retriever_title: Optional[str] = None) -> dict:
154
  """
155
+ Versión mejorada que puede filtrar por título de retriever
156
 
157
+ Parameters:
158
+ retriever_title: Opcional. Si se especifica, solo devuelve los de este título
 
 
 
159
  """
160
  available_retrievers = []
161
 
162
  for full_index_name in indices.keys():
 
163
  parts = full_index_name.split('_')
164
  source = parts[0]
 
165
 
166
+ # Filtrar por título si se especificó
167
+ if retriever_title and source != retriever_title:
168
+ continue
169
+
170
+ # Obtener metadatos del JSON si existen
171
+ metadata = retrievers_metadata.get(source, {}).get(full_index_name, {})
 
 
172
 
173
  available_retrievers.append({
174
  "retriever_name": full_index_name,
175
  "source": source,
176
+ "index_name": '_'.join(parts[1:]) if len(parts) > 1 else "default",
177
+ "description": metadata.get("description", f"Documentos de {source.upper()}"),
178
+ "content_info": metadata.get("content_info", "No description available"),
179
+ "last_updated": metadata.get("last_updated", "unknown")
180
  })
181
 
182
+ if retriever_title and not available_retrievers:
183
+ return {
184
+ "error": f"No hay retrievers para el título '{retriever_title}'",
185
+ "available_titles": list(retrievers_metadata.keys())
186
+ }
187
+
188
  return {
189
  "retrievers": available_retrievers,
190
  "count": len(available_retrievers),
191
+ "filtered_by": retriever_title if retriever_title else "all"
 
192
  }
193
 
194