@@ -3,12 +3,15 @@ package link.socket.ampere.dsl.config
33import link.socket.ampere.domain.ai.configuration.AIConfiguration
44import link.socket.ampere.domain.ai.configuration.AIConfiguration_Default
55import link.socket.ampere.domain.ai.configuration.AIConfiguration_WithBackups
6+ import link.socket.ampere.domain.ai.model.AIModel
67import link.socket.ampere.domain.ai.model.AIModel_Claude
78import link.socket.ampere.domain.ai.model.AIModel_Gemini
89import link.socket.ampere.domain.ai.model.AIModel_OpenAI
10+ import link.socket.ampere.domain.ai.provider.AIProvider
911import link.socket.ampere.domain.ai.provider.AIProvider_Anthropic
1012import link.socket.ampere.domain.ai.provider.AIProvider_Google
1113import link.socket.ampere.domain.ai.provider.AIProvider_OpenAI
14+ import link.socket.ampere.domain.tool.AITool
1215
1316/* *
1417 * Base interface for provider-specific configurations in the DSL.
@@ -31,7 +34,7 @@ sealed interface ProviderConfig {
3134 * )
3235 * ```
3336 *
34- * @param apiKey Optional API key ( falls back to environment variable if not provided)
37+ * @param apiKey Optional runtime API key. When omitted, falls back to the generated KotlinConfig value.
3538 * @param model The Claude model to use (defaults to Sonnet 4)
3639 */
3740data class AnthropicConfig (
@@ -42,7 +45,11 @@ data class AnthropicConfig(
4245
4346 override fun toAIConfiguration (): AIConfiguration {
4447 val primary = AIConfiguration_Default (
45- provider = AIProvider_Anthropic ,
48+ provider = runtimeProviderOrDefault(
49+ apiKey = apiKey,
50+ defaultProvider = AIProvider_Anthropic ,
51+ runtimeProviderFactory = AIProvider_Anthropic ::withApiToken,
52+ ),
4653 model = model,
4754 )
4855
@@ -72,7 +79,7 @@ data class AnthropicConfig(
7279 * )
7380 * ```
7481 *
75- * @param apiKey Optional API key ( falls back to environment variable if not provided)
82+ * @param apiKey Optional runtime API key. When omitted, falls back to the generated KotlinConfig value.
7683 * @param model The OpenAI model to use (defaults to GPT-4.1)
7784 */
7885data class OpenAIConfig (
@@ -83,7 +90,11 @@ data class OpenAIConfig(
8390
8491 override fun toAIConfiguration (): AIConfiguration {
8592 val primary = AIConfiguration_Default (
86- provider = AIProvider_OpenAI ,
93+ provider = runtimeProviderOrDefault(
94+ apiKey = apiKey,
95+ defaultProvider = AIProvider_OpenAI ,
96+ runtimeProviderFactory = AIProvider_OpenAI ::withApiToken,
97+ ),
8798 model = model,
8899 )
89100
@@ -113,7 +124,7 @@ data class OpenAIConfig(
113124 * )
114125 * ```
115126 *
116- * @param apiKey Optional API key ( falls back to environment variable if not provided)
127+ * @param apiKey Optional runtime API key. When omitted, falls back to the generated KotlinConfig value.
117128 * @param model The Gemini model to use (defaults to Flash 2.5)
118129 */
119130data class GeminiConfig (
@@ -124,7 +135,11 @@ data class GeminiConfig(
124135
125136 override fun toAIConfiguration (): AIConfiguration {
126137 val primary = AIConfiguration_Default (
127- provider = AIProvider_Google ,
138+ provider = runtimeProviderOrDefault(
139+ apiKey = apiKey,
140+ defaultProvider = AIProvider_Google ,
141+ runtimeProviderFactory = AIProvider_Google ::withApiToken,
142+ ),
128143 model = model,
129144 )
130145
@@ -142,3 +157,9 @@ data class GeminiConfig(
142157 backups = backups + config.toAIConfiguration(),
143158 )
144159}
160+
161+ private fun <TD : AITool , L : AIModel > runtimeProviderOrDefault (
162+ apiKey : String? ,
163+ defaultProvider : AIProvider <TD , L >,
164+ runtimeProviderFactory : (String ) -> AIProvider <TD , L >,
165+ ): AIProvider <TD , L > = apiKey?.let (runtimeProviderFactory) ? : defaultProvider
0 commit comments