Skip to content

Commit ae7516b

Browse files
committed
use inheritance for configs for consistency
1 parent 951eda1 commit ae7516b

File tree

1 file changed

+61
-70
lines changed

1 file changed

+61
-70
lines changed

ldai/models.py

Lines changed: 61 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -139,61 +139,91 @@ def to_dict(self) -> dict:
139139

140140

141141
# ============================================================================
142-
# Completion Config Types
142+
# Base AI Config Types
143143
# ============================================================================
144144

145145
@dataclass(frozen=True)
146-
class AICompletionConfigDefault:
146+
class AIConfigDefault:
147147
"""
148-
Default Completion AI Config (default mode).
148+
Base AI Config interface for default implementations with optional enabled property.
149149
"""
150150
enabled: Optional[bool] = None
151151
model: Optional[ModelConfig] = None
152-
messages: Optional[List[LDMessage]] = None
153152
provider: Optional[ProviderConfig] = None
154-
judge_configuration: Optional[JudgeConfiguration] = None
155153

156-
def to_dict(self) -> dict:
154+
def _base_to_dict(self) -> Dict[str, Any]:
157155
"""
158-
Render the given default values as an AICompletionConfigDefault-compatible dictionary object.
156+
Render the base config fields as a dictionary object.
159157
"""
160-
result = {
158+
return {
161159
'_ldMeta': {
162160
'enabled': self.enabled or False,
163161
},
164162
'model': self.model.to_dict() if self.model else None,
165-
'messages': [message.to_dict() for message in self.messages] if self.messages else None,
166163
'provider': self.provider.to_dict() if self.provider else None,
167164
}
168-
if self.judge_configuration is not None:
169-
result['judgeConfiguration'] = self.judge_configuration.to_dict()
170-
return result
171165

172166

173167
@dataclass(frozen=True)
174-
class AICompletionConfig:
168+
class AIConfig:
175169
"""
176-
Completion AI Config (default mode).
170+
Base AI Config interface without mode-specific fields.
177171
"""
178172
enabled: bool
179173
model: Optional[ModelConfig] = None
180-
messages: Optional[List[LDMessage]] = None
181174
provider: Optional[ProviderConfig] = None
182175
tracker: Optional[LDAIConfigTracker] = None
183-
judge_configuration: Optional[JudgeConfiguration] = None
184176

185-
def to_dict(self) -> dict:
177+
def _base_to_dict(self) -> Dict[str, Any]:
186178
"""
187-
Render the given completion config as a dictionary object.
179+
Render the base config fields as a dictionary object.
188180
"""
189-
result = {
181+
return {
190182
'_ldMeta': {
191183
'enabled': self.enabled,
192184
},
193185
'model': self.model.to_dict() if self.model else None,
194-
'messages': [message.to_dict() for message in self.messages] if self.messages else None,
195186
'provider': self.provider.to_dict() if self.provider else None,
196187
}
188+
189+
190+
# ============================================================================
191+
# Completion Config Types
192+
# ============================================================================
193+
194+
@dataclass(frozen=True)
195+
class AICompletionConfigDefault(AIConfigDefault):
196+
"""
197+
Default Completion AI Config (default mode).
198+
"""
199+
messages: Optional[List[LDMessage]] = None
200+
judge_configuration: Optional[JudgeConfiguration] = None
201+
202+
def to_dict(self) -> dict:
203+
"""
204+
Render the given default values as an AICompletionConfigDefault-compatible dictionary object.
205+
"""
206+
result = self._base_to_dict()
207+
result['messages'] = [message.to_dict() for message in self.messages] if self.messages else None
208+
if self.judge_configuration is not None:
209+
result['judgeConfiguration'] = self.judge_configuration.to_dict()
210+
return result
211+
212+
213+
@dataclass(frozen=True)
214+
class AICompletionConfig(AIConfig):
215+
"""
216+
Completion AI Config (default mode).
217+
"""
218+
messages: Optional[List[LDMessage]] = None
219+
judge_configuration: Optional[JudgeConfiguration] = None
220+
221+
def to_dict(self) -> dict:
222+
"""
223+
Render the given completion config as a dictionary object.
224+
"""
225+
result = self._base_to_dict()
226+
result['messages'] = [message.to_dict() for message in self.messages] if self.messages else None
197227
if self.judge_configuration is not None:
198228
result['judgeConfiguration'] = self.judge_configuration.to_dict()
199229
return result
@@ -203,29 +233,19 @@ def to_dict(self) -> dict:
203233
# Agent Config Types
204234
# ============================================================================
205235

206-
207236
@dataclass(frozen=True)
208-
class AIAgentConfigDefault:
237+
class AIAgentConfigDefault(AIConfigDefault):
209238
"""
210239
Default Agent-specific AI Config with instructions.
211240
"""
212-
enabled: Optional[bool] = None
213-
model: Optional[ModelConfig] = None
214-
provider: Optional[ProviderConfig] = None
215241
instructions: Optional[str] = None
216242
judge_configuration: Optional[JudgeConfiguration] = None
217243

218244
def to_dict(self) -> Dict[str, Any]:
219245
"""
220246
Render the given agent config default as a dictionary object.
221247
"""
222-
result: Dict[str, Any] = {
223-
'_ldMeta': {
224-
'enabled': self.enabled or False,
225-
},
226-
'model': self.model.to_dict() if self.model else None,
227-
'provider': self.provider.to_dict() if self.provider else None,
228-
}
248+
result = self._base_to_dict()
229249
if self.instructions is not None:
230250
result['instructions'] = self.instructions
231251
if self.judge_configuration is not None:
@@ -234,28 +254,18 @@ def to_dict(self) -> Dict[str, Any]:
234254

235255

236256
@dataclass(frozen=True)
237-
class AIAgentConfig:
257+
class AIAgentConfig(AIConfig):
238258
"""
239259
Agent-specific AI Config with instructions.
240260
"""
241-
enabled: bool
242-
model: Optional[ModelConfig] = None
243-
provider: Optional[ProviderConfig] = None
244261
instructions: Optional[str] = None
245-
tracker: Optional[LDAIConfigTracker] = None
246262
judge_configuration: Optional[JudgeConfiguration] = None
247263

248264
def to_dict(self) -> Dict[str, Any]:
249265
"""
250266
Render the given agent config as a dictionary object.
251267
"""
252-
result: Dict[str, Any] = {
253-
'_ldMeta': {
254-
'enabled': self.enabled,
255-
},
256-
'model': self.model.to_dict() if self.model else None,
257-
'provider': self.provider.to_dict() if self.provider else None,
258-
}
268+
result = self._base_to_dict()
259269
if self.instructions is not None:
260270
result['instructions'] = self.instructions
261271
if self.judge_configuration is not None:
@@ -268,58 +278,39 @@ def to_dict(self) -> Dict[str, Any]:
268278
# ============================================================================
269279

270280
@dataclass(frozen=True)
271-
class AIJudgeConfigDefault:
281+
class AIJudgeConfigDefault(AIConfigDefault):
272282
"""
273283
Default Judge-specific AI Config with required evaluation metric key.
274284
"""
275-
enabled: Optional[bool] = None
276-
model: Optional[ModelConfig] = None
277285
messages: Optional[List[LDMessage]] = None
278-
provider: Optional[ProviderConfig] = None
279286
evaluation_metric_keys: Optional[List[str]] = None
280287

281288
def to_dict(self) -> dict:
282289
"""
283290
Render the given judge config default as a dictionary object.
284291
"""
285-
result = {
286-
'_ldMeta': {
287-
'enabled': self.enabled or False,
288-
},
289-
'model': self.model.to_dict() if self.model else None,
290-
'messages': [message.to_dict() for message in self.messages] if self.messages else None,
291-
'provider': self.provider.to_dict() if self.provider else None,
292-
}
292+
result = self._base_to_dict()
293+
result['messages'] = [message.to_dict() for message in self.messages] if self.messages else None
293294
if self.evaluation_metric_keys is not None:
294295
result['evaluationMetricKeys'] = self.evaluation_metric_keys
295296
return result
296297

297298

298299
@dataclass(frozen=True)
299-
class AIJudgeConfig:
300+
class AIJudgeConfig(AIConfig):
300301
"""
301302
Judge-specific AI Config with required evaluation metric key.
302303
"""
303-
enabled: bool
304304
evaluation_metric_keys: List[str]
305-
model: Optional[ModelConfig] = None
306305
messages: Optional[List[LDMessage]] = None
307-
provider: Optional[ProviderConfig] = None
308-
tracker: Optional[LDAIConfigTracker] = None
309306

310307
def to_dict(self) -> dict:
311308
"""
312309
Render the given judge config as a dictionary object.
313310
"""
314-
result = {
315-
'_ldMeta': {
316-
'enabled': self.enabled,
317-
},
318-
'evaluationMetricKeys': self.evaluation_metric_keys,
319-
'model': self.model.to_dict() if self.model else None,
320-
'messages': [message.to_dict() for message in self.messages] if self.messages else None,
321-
'provider': self.provider.to_dict() if self.provider else None,
322-
}
311+
result = self._base_to_dict()
312+
result['evaluationMetricKeys'] = self.evaluation_metric_keys
313+
result['messages'] = [message.to_dict() for message in self.messages] if self.messages else None
323314
return result
324315

325316

0 commit comments

Comments
 (0)