mirror of
				https://github.com/open-webui/mcpo
				synced 2025-06-26 18:26:58 +00:00 
			
		
		
		
	refac: substandard code
	
		
			
	
		
	
	
		
	
		
			Some checks are pending
		
		
	
	
		
			
				
	
				Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
				
			
		
			
				
	
				Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
				
			
		
			
				
	
				Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
				
			
		
		
	
	
				
					
				
			
		
			Some checks are pending
		
		
	
	Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
				
			Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
				
			Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
				
			This commit is contained in:
		
							parent
							
								
									1566a34c9c
								
							
						
					
					
						commit
						fe95c6a6fa
					
				| @ -36,32 +36,34 @@ async def create_dynamic_endpoints(app: FastAPI, api_dependency=None): | |||||||
|     for tool in tools: |     for tool in tools: | ||||||
|         endpoint_name = tool.name |         endpoint_name = tool.name | ||||||
|         endpoint_description = tool.description |         endpoint_description = tool.description | ||||||
|  | 
 | ||||||
|         inputSchema = tool.inputSchema |         inputSchema = tool.inputSchema | ||||||
|         outputSchema = getattr(tool, "outputSchema", None) |         outputSchema = getattr(tool, "outputSchema", None) | ||||||
| 
 | 
 | ||||||
|         custom_fileds = inputSchema.get("$defs", {}) |  | ||||||
|         required_fields = inputSchema.get("required", []) |  | ||||||
|         properties = inputSchema.get("properties", {}) |  | ||||||
|         form_model_name = f"{endpoint_name}_form_model" |         form_model_name = f"{endpoint_name}_form_model" | ||||||
|         model_fields = get_model_fields( |         form_model_fields = get_model_fields( | ||||||
|             form_model_name, |             form_model_name, | ||||||
|             properties, |             inputSchema.get("properties", {}), | ||||||
|             required_fields, |             inputSchema.get("required", []), | ||||||
|             custom_fileds, |             inputSchema.get("$defs", {}), | ||||||
|         ) |         ) | ||||||
|  | 
 | ||||||
|  |         response_model_fields = None | ||||||
|         if outputSchema: |         if outputSchema: | ||||||
|             output_model_name = f"{endpoint_name}_output_model" |             response_model_name = f"{endpoint_name}_response_model" | ||||||
|             output_model_fields = get_model_fields( |             response_model_fields = get_model_fields( | ||||||
|                 output_model_name, |                 response_model_name, | ||||||
|                 outputSchema.get("properties", {}), |                 outputSchema.get("properties", {}), | ||||||
|                 outputSchema.get("required", []), |                 outputSchema.get("required", []), | ||||||
|                 outputSchema.get("$defs", {}), |                 outputSchema.get("$defs", {}), | ||||||
|             ) |             ) | ||||||
|         else: |  | ||||||
|             output_model_fields = None |  | ||||||
| 
 | 
 | ||||||
|         tool_handler = get_tool_handler( |         tool_handler = get_tool_handler( | ||||||
|             session, endpoint_name, form_model_name, model_fields, output_model_fields |             session, | ||||||
|  |             endpoint_name, | ||||||
|  |             form_model_name, | ||||||
|  |             form_model_fields, | ||||||
|  |             response_model_fields, | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         app.post( |         app.post( | ||||||
|  | |||||||
| @ -54,7 +54,7 @@ def _process_schema_property( | |||||||
|     model_name_prefix: str, |     model_name_prefix: str, | ||||||
|     prop_name: str, |     prop_name: str, | ||||||
|     is_required: bool, |     is_required: bool, | ||||||
|     custom_fields: Optional[Dict] = None, |     schema_defs: Optional[Dict] = None, | ||||||
| ) -> tuple[Union[Type, List, ForwardRef, Any], FieldInfo]: | ) -> tuple[Union[Type, List, ForwardRef, Any], FieldInfo]: | ||||||
|     """ |     """ | ||||||
|     Recursively processes a schema property to determine its Python type hint |     Recursively processes a schema property to determine its Python type hint | ||||||
| @ -67,11 +67,12 @@ def _process_schema_property( | |||||||
|     if "$ref" in prop_schema: |     if "$ref" in prop_schema: | ||||||
|         ref = prop_schema["$ref"] |         ref = prop_schema["$ref"] | ||||||
|         ref = ref.split("/")[-1] |         ref = ref.split("/")[-1] | ||||||
|         assert ref in custom_fields, "Custom field not found" |         assert ref in schema_defs, "Custom field not found" | ||||||
|         prop_schema = custom_fields[ref] |         prop_schema = schema_defs[ref] | ||||||
| 
 | 
 | ||||||
|     prop_type = prop_schema.get("type") |     prop_type = prop_schema.get("type") | ||||||
|     prop_desc = prop_schema.get("description", "") |     prop_desc = prop_schema.get("description", "") | ||||||
|  | 
 | ||||||
|     default_value = ... if is_required else prop_schema.get("default", None) |     default_value = ... if is_required else prop_schema.get("default", None) | ||||||
|     pydantic_field = Field(default=default_value, description=prop_desc) |     pydantic_field = Field(default=default_value, description=prop_desc) | ||||||
| 
 | 
 | ||||||
| @ -126,7 +127,7 @@ def _process_schema_property( | |||||||
|                 nested_model_name, |                 nested_model_name, | ||||||
|                 name, |                 name, | ||||||
|                 is_nested_required, |                 is_nested_required, | ||||||
|                 custom_fields, |                 schema_defs, | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
|             nested_fields[name] = (nested_type_hint, nested_pydantic_field) |             nested_fields[name] = (nested_type_hint, nested_pydantic_field) | ||||||
| @ -152,7 +153,7 @@ def _process_schema_property( | |||||||
|             f"{model_name_prefix}_{prop_name}", |             f"{model_name_prefix}_{prop_name}", | ||||||
|             "item", |             "item", | ||||||
|             False,  # Items aren't required at this level, |             False,  # Items aren't required at this level, | ||||||
|             custom_fields, |             schema_defs, | ||||||
|         ) |         ) | ||||||
|         list_type_hint = List[item_type_hint] |         list_type_hint = List[item_type_hint] | ||||||
|         return list_type_hint, pydantic_field |         return list_type_hint, pydantic_field | ||||||
| @ -171,7 +172,7 @@ def _process_schema_property( | |||||||
|         return Any, pydantic_field |         return Any, pydantic_field | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_model_fields(form_model_name, properties, required_fields, custom_fields=None): | def get_model_fields(form_model_name, properties, required_fields, schema_defs=None): | ||||||
|     model_fields = {} |     model_fields = {} | ||||||
| 
 | 
 | ||||||
|     _model_cache: Dict[str, Type] = {} |     _model_cache: Dict[str, Type] = {} | ||||||
| @ -184,7 +185,7 @@ def get_model_fields(form_model_name, properties, required_fields, custom_fields | |||||||
|             form_model_name, |             form_model_name, | ||||||
|             param_name, |             param_name, | ||||||
|             is_required, |             is_required, | ||||||
|             custom_fields, |             schema_defs, | ||||||
|         ) |         ) | ||||||
|         # Use the generated type hint and Field info |         # Use the generated type hint and Field info | ||||||
|         model_fields[param_name] = (python_type_hint, pydantic_field_info) |         model_fields[param_name] = (python_type_hint, pydantic_field_info) | ||||||
| @ -192,20 +193,24 @@ def get_model_fields(form_model_name, properties, required_fields, custom_fields | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_tool_handler( | def get_tool_handler( | ||||||
|     session, endpoint_name, form_model_name, model_fields, output_model_fileds=None |     session, | ||||||
|  |     endpoint_name, | ||||||
|  |     form_model_name, | ||||||
|  |     form_model_fields, | ||||||
|  |     response_model_fields=None, | ||||||
| ): | ): | ||||||
|     if model_fields: |     if form_model_fields: | ||||||
|         FormModel = create_model(form_model_name, **model_fields) |         FormModel = create_model(form_model_name, **form_model_fields) | ||||||
|         OutputModel = ( |         ResponseModel = ( | ||||||
|             create_model(f"{endpoint_name}_output_model", **output_model_fileds) |             create_model(f"{endpoint_name}_response_model", **response_model_fields) | ||||||
|             if output_model_fileds |             if response_model_fields | ||||||
|             else Any |             else Any | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         def make_endpoint_func( |         def make_endpoint_func( | ||||||
|             endpoint_name: str, FormModel, session: ClientSession |             endpoint_name: str, FormModel, session: ClientSession | ||||||
|         ):  # Parameterized endpoint |         ):  # Parameterized endpoint | ||||||
|             async def tool(form_data: FormModel) -> OutputModel: |             async def tool(form_data: FormModel) -> ResponseModel: | ||||||
|                 args = form_data.model_dump(exclude_none=True) |                 args = form_data.model_dump(exclude_none=True) | ||||||
|                 print(f"Calling endpoint: {endpoint_name}, with args: {args}") |                 print(f"Calling endpoint: {endpoint_name}, with args: {args}") | ||||||
|                 try: |                 try: | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user