3838class ServerConfig (BaseModel ):
3939 """Server configuration settings."""
4040
41- model_config = ConfigDict (extra = "forbid " )
41+ model_config = ConfigDict (extra = "ignore " )
4242
4343 host : str = Field ("127.0.0.1" , description = "Server host address" )
4444 port : int = Field (8000 , ge = 1024 , le = 65535 , description = "Server port" )
@@ -59,7 +59,7 @@ def validate_log_level(cls, v: str) -> str:
5959class WorkspaceBounds (BaseModel ):
6060 """Workspace boundary coordinates."""
6161
62- model_config = ConfigDict (extra = "forbid " )
62+ model_config = ConfigDict (extra = "ignore " )
6363
6464 x_min : float = Field (..., description = "Minimum X coordinate (meters)" )
6565 x_max : float = Field (..., description = "Maximum X coordinate (meters)" )
@@ -86,7 +86,7 @@ def validate_y_range(cls, v: float, info) -> float:
8686class WorkspaceConfig (BaseModel ):
8787 """Workspace configuration."""
8888
89- model_config = ConfigDict (extra = "forbid " )
89+ model_config = ConfigDict (extra = "ignore " )
9090
9191 id : str = Field (..., description = "Workspace identifier" )
9292 bounds : WorkspaceBounds = Field (..., description = "Workspace boundaries" )
@@ -104,7 +104,7 @@ def validate_center(cls, v: list[float]) -> list[float]:
104104class MotionConfig (BaseModel ):
105105 """Robot motion parameters."""
106106
107- model_config = ConfigDict (extra = "forbid " )
107+ model_config = ConfigDict (extra = "ignore " )
108108
109109 pick_z_offset : float = Field (0.001 , ge = 0.0 , le = 0.1 , description = "Z-offset for picking (m)" )
110110 place_z_offset : float = Field (0.001 , ge = 0.0 , le = 0.1 , description = "Z-offset for placing (m)" )
@@ -118,7 +118,7 @@ class MotionConfig(BaseModel):
118118class RobotConfig (BaseModel ):
119119 """Robot configuration settings."""
120120
121- model_config = ConfigDict (extra = "forbid " )
121+ model_config = ConfigDict (extra = "ignore " )
122122
123123 type : str = Field ("niryo" , description = "Robot type" )
124124 simulation : bool = Field (True , description = "Use simulation mode" )
@@ -141,7 +141,7 @@ def validate_robot_type(cls, v: str) -> str:
141141class SpatialConfig (BaseModel ):
142142 """Spatial query thresholds."""
143143
144- model_config = ConfigDict (extra = "forbid " )
144+ model_config = ConfigDict (extra = "ignore " )
145145
146146 close_to_radius_m : float = Field (0.02 , ge = 0.001 , le = 0.5 , description = "'Close to' radius (m)" )
147147 left_right_threshold_m : float = Field (0.01 , ge = 0.001 , le = 0.1 , description = "Left/right threshold (m)" )
@@ -151,7 +151,7 @@ class SpatialConfig(BaseModel):
151151class DetectionConfig (BaseModel ):
152152 """Object detection settings."""
153153
154- model_config = ConfigDict (extra = "forbid " )
154+ model_config = ConfigDict (extra = "ignore " )
155155
156156 model : str = Field ("owlv2" , description = "Detection model" )
157157 device : str = Field ("cuda" , description = "Computation device" )
@@ -183,7 +183,7 @@ def validate_device(cls, v: str) -> str:
183183class LLMProviderConfig (BaseModel ):
184184 """LLM provider-specific settings."""
185185
186- model_config = ConfigDict (extra = "forbid " )
186+ model_config = ConfigDict (extra = "ignore " )
187187
188188 enabled : bool = Field (True , description = "Enable this provider" )
189189 default_model : str = Field (..., description = "Default model name" )
@@ -195,7 +195,7 @@ class LLMProviderConfig(BaseModel):
195195class LLMConfig (BaseModel ):
196196 """LLM configuration settings."""
197197
198- model_config = ConfigDict (extra = "forbid " )
198+ model_config = ConfigDict (extra = "ignore " )
199199
200200 default_provider : str = Field ("auto" , description = "Default LLM provider" )
201201 temperature : float = Field (0.7 , ge = 0.0 , le = 2.0 , description = "Sampling temperature" )
@@ -218,7 +218,7 @@ def validate_provider(cls, v: str) -> str:
218218class TTSProviderConfig (BaseModel ):
219219 """TTS provider settings."""
220220
221- model_config = ConfigDict (extra = "forbid " )
221+ model_config = ConfigDict (extra = "ignore " )
222222
223223 voice_id : Optional [str ] = None
224224 voice : Optional [str ] = None
@@ -230,7 +230,7 @@ class TTSProviderConfig(BaseModel):
230230class TTSConfig (BaseModel ):
231231 """Text-to-speech settings."""
232232
233- model_config = ConfigDict (extra = "forbid " )
233+ model_config = ConfigDict (extra = "ignore " )
234234
235235 enabled : bool = Field (True , description = "Enable TTS" )
236236 provider : str = Field ("elevenlabs" , description = "TTS provider" )
@@ -250,7 +250,7 @@ def validate_provider(cls, v: str) -> str:
250250class RedisStreamsConfig (BaseModel ):
251251 """Redis stream names."""
252252
253- model_config = ConfigDict (extra = "forbid " )
253+ model_config = ConfigDict (extra = "ignore " )
254254
255255 camera : str = Field ("robot_camera" , description = "Camera stream name" )
256256 detected_objects : str = Field ("detected_objects" , description = "Detected objects stream" )
@@ -260,7 +260,7 @@ class RedisStreamsConfig(BaseModel):
260260class RedisConfig (BaseModel ):
261261 """Redis connection settings."""
262262
263- model_config = ConfigDict (extra = "forbid " )
263+ model_config = ConfigDict (extra = "ignore " )
264264
265265 host : str = Field ("localhost" , description = "Redis host" )
266266 port : int = Field (6379 , ge = 1 , le = 65535 , description = "Redis port" )
@@ -272,7 +272,7 @@ class RedisConfig(BaseModel):
272272class GUIConfig (BaseModel ):
273273 """GUI settings."""
274274
275- model_config = ConfigDict (extra = "forbid " )
275+ model_config = ConfigDict (extra = "ignore " )
276276
277277 host : str = Field ("127.0.0.1" , description = "GUI host" )
278278 port : int = Field (7860 , ge = 1024 , le = 65535 , description = "GUI port" )
@@ -285,7 +285,7 @@ class GUIConfig(BaseModel):
285285class LogRotationConfig (BaseModel ):
286286 """Log rotation settings."""
287287
288- model_config = ConfigDict (extra = "forbid " )
288+ model_config = ConfigDict (extra = "ignore " )
289289
290290 max_bytes : int = Field (10485760 , ge = 1024 , description = "Max log file size (bytes)" )
291291 backup_count : int = Field (5 , ge = 1 , le = 100 , description = "Number of backup files" )
@@ -294,7 +294,7 @@ class LogRotationConfig(BaseModel):
294294class LoggingConfig (BaseModel ):
295295 """Logging configuration."""
296296
297- model_config = ConfigDict (extra = "forbid " )
297+ model_config = ConfigDict (extra = "ignore " )
298298
299299 format : str = Field (..., description = "Log message format" )
300300 date_format : str = Field ("%Y-%m-%d %H:%M:%S" , description = "Date format" )
@@ -305,17 +305,22 @@ class LoggingConfig(BaseModel):
305305class EnvironmentOverrides (BaseModel ):
306306 """Environment-specific configuration overrides."""
307307
308- model_config = ConfigDict (extra = "allow " )
308+ model_config = ConfigDict (extra = "ignore " )
309309
310- server : Optional [Dict [str , Any ]] = None
311- robot : Optional [Dict [str , Any ]] = None
312- llm : Optional [Dict [str , Any ]] = None
310+ server : Optional [ServerConfig ] = None
311+ robot : Optional [RobotConfig ] = None
312+ llm : Optional [LLMConfig ] = None
313+ detection : Optional [DetectionConfig ] = None
314+ tts : Optional [TTSConfig ] = None
315+ redis : Optional [RedisConfig ] = None
316+ gui : Optional [GUIConfig ] = None
317+ logging : Optional [LoggingConfig ] = None
313318
314319
315320class RobotMCPConfig (BaseModel ):
316321 """Root configuration model."""
317322
318- model_config = ConfigDict (extra = "forbid " )
323+ model_config = ConfigDict (extra = "ignore " )
319324
320325 server : ServerConfig
321326 robot : RobotConfig
0 commit comments