Skip to content

Commit 8728fa1

Browse files
committed
Create model selection flow
1 parent cdbbae9 commit 8728fa1

101 files changed

Lines changed: 1687 additions & 1594 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

shared/src/androidMain/kotlin/link/socket/kore/ui/agent/AgentCreationScreenPreview.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ import androidx.compose.runtime.Composable
55
import androidx.compose.ui.Modifier
66
import androidx.compose.ui.tooling.preview.Preview
77
import link.socket.kore.domain.agent.bundled.WriteCodeAgent
8-
import link.socket.kore.domain.ai.AI_OpenAI
9-
import link.socket.kore.domain.llm.LLM_OpenAI
10-
import link.socket.kore.ui.model.ModelSelector
8+
import link.socket.kore.domain.ai.AIProvider_OpenAI
9+
import link.socket.kore.domain.ai.model.AIModel_OpenAI
10+
import link.socket.kore.ui.model.ModelSelectionSection
1111

1212
@Preview(showBackground = true, widthDp = 360, heightDp = 800)
1313
@Composable
1414
fun PreviewAgentCreationScreen() {
15-
AgentCreationScreen(
15+
AgentSelectionSection(
1616
modifier = Modifier.fillMaxSize(),
1717
selectedAgentDefinition = WriteCodeAgent,
18-
setSelectedAgentDefinitionChanged = {},
18+
setAgentPartiallySelected = {},
1919
onCreateAgent = {},
2020
onBackClicked = {},
2121
)
@@ -33,9 +33,9 @@ fun PreviewAgentColumn() {
3333
@Preview(showBackground = true, widthDp = 360, heightDp = 220)
3434
@Composable
3535
fun PreviewProviderModelSelector() {
36-
ModelSelector(
37-
selectedProvider = AI_OpenAI,
38-
selectedModel = LLM_OpenAI.DEFAULT,
36+
ModelSelectionSection(
37+
selectedProvider = AIProvider_OpenAI,
38+
selectedModel = AIModel_OpenAI.DEFAULT,
3939
selectableProviders = emptyList(),
4040
selectableModels = emptyList(),
4141
suggestedModels = emptyList(),

shared/src/commonMain/kotlin/link/socket/kore/data/ConversationRepository.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package link.socket.kore.data
22

33
import kotlinx.coroutines.CoroutineScope
44
import link.socket.kore.domain.agent.KoreAgent
5+
import link.socket.kore.domain.ai.configuration.AIConfiguration
56
import link.socket.kore.domain.chat.Chat
67
import link.socket.kore.domain.chat.Conversation
78
import link.socket.kore.domain.chat.ConversationId
8-
import link.socket.kore.domain.config.AI_Configuration
99
import link.socket.kore.util.logWith
1010
import link.socket.kore.util.randomUUID
1111

@@ -50,7 +50,7 @@ class ConversationRepository(
5050
}
5151

5252
suspend fun runConversation(
53-
config: AI_Configuration,
53+
config: AIConfiguration,
5454
conversationId: ConversationId
5555
) {
5656
var shouldRerun = false
@@ -62,15 +62,15 @@ class ConversationRepository(
6262

6363
getValue(conversationId)?.let { conversation ->
6464
with(conversation) {
65-
val selectedLLM = config.selectedLLM
65+
val selectedLLM = config.model
6666
if (selectedLLM == null) {
6767
logWith("$tag-runConversation").e("No LLM selected")
6868
return@let
6969
}
7070
val completionRequest = getCompletionRequest(selectedLLM)
7171
println(completionRequest)
7272

73-
val client = config.aiProvider.client
73+
val client = config.provider.client
7474
val ranTools = agent.execute(
7575
client = client,
7676
completionRequest = completionRequest,
@@ -98,7 +98,7 @@ class ConversationRepository(
9898
* @param input The user input to be added as a chat
9999
*/
100100
suspend fun addUserChat(
101-
config: AI_Configuration,
101+
config: AIConfiguration,
102102
conversationId: ConversationId,
103103
input: String,
104104
) {

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/KoreAgent.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import kotlinx.coroutines.CoroutineScope
66
import link.socket.kore.domain.agent.bundled.AgentDefinition
77
import link.socket.kore.domain.capability.AgentCapability
88
import link.socket.kore.domain.capability.IOCapability
9-
import link.socket.kore.domain.config.AI_Configuration
9+
import link.socket.kore.domain.ai.configuration.AIConfiguration
1010
import link.socket.kore.domain.tool.FunctionProvider
1111

1212
data class KoreAgent(
13-
override val config: AI_Configuration,
13+
override val config: AIConfiguration,
1414
override val scope: CoroutineScope,
1515
val definition: AgentDefinition,
1616
val agentFactory: KoreAgentFactory,

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/KoreAgentFactory.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import link.socket.kore.data.ConversationRepository
66
import link.socket.kore.domain.agent.bundled.AgentDefinition
77
import link.socket.kore.domain.agent.bundled.getAgentDefinition
88
import link.socket.kore.domain.chat.ConversationId
9-
import link.socket.kore.domain.config.AI_Configuration
9+
import link.socket.kore.domain.ai.configuration.AIConfiguration
1010
import link.socket.kore.util.logWith
1111

1212
data class PromptSubAgentParams(
13-
val config: AI_Configuration,
13+
val config: AIConfiguration,
1414
val parentConversationId: ConversationId,
1515
val scope: CoroutineScope,
1616
val agentName: String?,
@@ -26,7 +26,7 @@ class KoreAgentFactory(
2626
get() = { params ->
2727
with(params) {
2828
// TODO: Improve repetitive logging for function calls, use better format
29-
logWith(tag).i("\nllm=${config.selectedLLM?.name}\nparentConversationId=$parentConversationId\nArgs:\nagentName=$agentName\nprompt=$prompt\n$initialUserChat")
29+
logWith(tag).i("\nllm=${config.model?.name}\nparentConversationId=$parentConversationId\nArgs:\nagentName=$agentName\nprompt=$prompt\n$initialUserChat")
3030

3131
val agent = KoreAgent(
3232
config = config,
@@ -72,7 +72,7 @@ class KoreAgentFactory(
7272
}
7373

7474
fun buildAgent(
75-
config: AI_Configuration,
75+
config: AIConfiguration,
7676
definition: AgentDefinition,
7777
scope: CoroutineScope,
7878
): KoreAgent {

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/LLMAgent.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import com.aallam.openai.client.OpenAI as Client
1212
import kotlinx.coroutines.CoroutineScope
1313
import kotlinx.coroutines.async
1414
import kotlinx.coroutines.awaitAll
15+
import link.socket.kore.domain.ai.configuration.AIConfiguration
16+
import link.socket.kore.domain.ai.model.AIModel
17+
import link.socket.kore.domain.ai.model.AIModel_Gemini
1518
import link.socket.kore.domain.chat.Chat
1619
import link.socket.kore.domain.chat.ConversationHistory
1720
import link.socket.kore.domain.chat.ConversationId
18-
import link.socket.kore.domain.config.AI_Configuration
19-
import link.socket.kore.domain.llm.LLM
20-
import link.socket.kore.domain.llm.LLM_Gemini
21-
import link.socket.kore.domain.llm.toModelId
2221
import link.socket.kore.domain.tool.FunctionDefinition
2322
import link.socket.kore.domain.tool.FunctionProvider
23+
import link.socket.kore.domain.util.toClientModelId
2424
import link.socket.kore.util.logWith
2525

2626
/**
@@ -31,7 +31,7 @@ interface LLMAgent {
3131
val tag: String
3232
get() = "LLMAgent"
3333

34-
val config: AI_Configuration
34+
val config: AIConfiguration
3535

3636
val scope: CoroutineScope
3737

@@ -190,15 +190,15 @@ interface LLMAgent {
190190
* @return ChatCompletionRequest ready to be sent to the OpenAI API
191191
*/
192192
fun createCompletionRequest(
193-
llm: LLM<*>,
193+
model: AIModel,
194194
conversationHistory: ConversationHistory,
195195
): ChatCompletionRequest {
196196
val filteredMessages = conversationHistory.getChats()
197197
.filter { it.chatMessage.content?.isNotBlank() == true }
198198
.map { it.chatMessage }
199199

200-
val messages = when (llm) {
201-
is LLM_Gemini -> {
200+
val messages = when (model) {
201+
is AIModel_Gemini -> {
202202
filteredMessages.map { message ->
203203
if (message.role == Role.System) {
204204
message.copy(
@@ -213,7 +213,7 @@ interface LLMAgent {
213213
}
214214

215215
return ChatCompletionRequest(
216-
model = llm.toModelId(),
216+
model = model.toClientModelId(),
217217
messages = messages,
218218
tools = tools.ifEmpty { null },
219219
topP = 0.2,

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/bundled/APIDesignAgent.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package link.socket.kore.domain.agent.bundled
22

33
import link.socket.kore.domain.agent.AgentInput
4-
import link.socket.kore.domain.ai.aiConfiguration
5-
import link.socket.kore.domain.llm.LLM_Claude
6-
import link.socket.kore.domain.llm.LLM_Gemini
7-
import link.socket.kore.domain.llm.LLM_OpenAI
4+
import link.socket.kore.domain.ai.model.AIModel_Claude
5+
import link.socket.kore.domain.ai.model.AIModel_Gemini
6+
import link.socket.kore.domain.ai.model.AIModel_OpenAI
87

98
private const val NAME = "API Design"
109
private const val DESCRIPTION = "Specialized agent for reviewing and optimizing Kotlin API design, focusing on consistency, usability, and adherence to best practices"
@@ -96,11 +95,13 @@ data object APIDesignAgent : AgentDefinition.Bundled(
9695
reviewType = "Public API Review",
9796
principle = "Kotlin Idioms",
9897
),
99-
aiConfiguration = aiConfiguration(
100-
LLM_Claude.Opus_4_1,
101-
aiConfiguration(LLM_OpenAI.GPT_4_1),
102-
aiConfiguration(LLM_Gemini.Pro_2_5),
103-
),
98+
defaultAIConfigurationBuilder = {
99+
aiConfiguration(
100+
AIModel_Claude.Opus_4_1,
101+
aiConfiguration(AIModel_OpenAI.GPT_4_1),
102+
aiConfiguration(AIModel_Gemini.Pro_2_5),
103+
)
104+
},
104105
) {
105106
private var reviewType: String = "Public API Review"
106107
private var designPrinciple: String = "Kotlin Idioms"
@@ -136,6 +137,6 @@ data object APIDesignAgent : AgentDefinition.Bundled(
136137
override val prompt: String
137138
get() = promptFrom(reviewType, designPrinciple)
138139

139-
override val neededInputs: List<AgentInput>
140+
override val requiredInputs: List<AgentInput>
140141
get() = listOf(reviewTypeArg, principleArg)
141142
}
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package link.socket.kore.domain.agent.bundled
22

33
import link.socket.kore.domain.agent.AgentInput
4+
import link.socket.kore.domain.ai.configuration.AIConfiguration
5+
import link.socket.kore.domain.ai.configuration.AIConfigurationFactory
46
import link.socket.kore.domain.chat.Instructions
5-
import link.socket.kore.domain.config.AI_Configuration
67

78
sealed interface AgentDefinition {
89
val name: String
910
val description: String
1011
val prompt: String
11-
val aiConfiguration: AI_Configuration
12+
val defaultAIConfigurationBuilder: AIConfigurationFactory.() -> AIConfiguration
1213

13-
val neededInputs: List<AgentInput>
14+
val requiredInputs: List<AgentInput>
1415
val optionalInputs: List<AgentInput>
1516

1617
val instructions: Instructions
@@ -23,17 +24,17 @@ sealed interface AgentDefinition {
2324
override val name: String,
2425
override val description: String,
2526
override val prompt: String,
26-
override val aiConfiguration: AI_Configuration,
27-
override val neededInputs: List<AgentInput> = emptyList(),
27+
override val defaultAIConfigurationBuilder: AIConfigurationFactory.() -> AIConfiguration,
28+
override val requiredInputs: List<AgentInput> = emptyList(),
2829
override val optionalInputs: List<AgentInput> = emptyList(),
2930
) : AgentDefinition
3031

3132
abstract class Custom(
3233
override val name: String,
3334
override val description: String,
3435
override val prompt: String,
35-
override val aiConfiguration: AI_Configuration,
36-
override val neededInputs: List<AgentInput> = emptyList(),
36+
override val defaultAIConfigurationBuilder: (AIConfigurationFactory) -> AIConfiguration,
37+
override val requiredInputs: List<AgentInput> = emptyList(),
3738
override val optionalInputs: List<AgentInput> = emptyList(),
3839
) : AgentDefinition
3940
}

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/bundled/AgentList.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ val agentList: List<AgentDefinition> =
5555
val agentArgsList: List<String> =
5656
agentList.map { agent ->
5757
"${agent.name}(" + (
58-
agent.neededInputs.joinToString(", ") { input ->
58+
agent.requiredInputs.joinToString(", ") { input ->
5959
input.key + ": " +
6060
when (input) {
6161
is AgentInput.EnumArgs -> "Enum"

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/bundled/BusinessAgent.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package link.socket.kore.domain.agent.bundled
22

3-
import link.socket.kore.domain.ai.aiConfiguration
4-
import link.socket.kore.domain.llm.LLM_Claude
5-
import link.socket.kore.domain.llm.LLM_Gemini
6-
import link.socket.kore.domain.llm.LLM_OpenAI
3+
import link.socket.kore.domain.ai.model.AIModel_Claude
4+
import link.socket.kore.domain.ai.model.AIModel_Gemini
5+
import link.socket.kore.domain.ai.model.AIModel_OpenAI
76

87
private const val NAME = "Business Advisor"
98
private const val DESCRIPTION = "Business coaching agent that helps entrepreneurs transform ideas into viable companies through market analysis, funding strategies, and operational guidance"
@@ -26,9 +25,11 @@ data object BusinessAgent : AgentDefinition.Bundled(
2625
name = NAME,
2726
description = DESCRIPTION,
2827
prompt = PROMPT,
29-
aiConfiguration = aiConfiguration(
30-
LLM_OpenAI.GPT_5,
31-
aiConfiguration(LLM_Claude.Opus_4_1),
32-
aiConfiguration(LLM_Gemini.Pro_2_5),
33-
),
28+
defaultAIConfigurationBuilder = {
29+
aiConfiguration(
30+
AIModel_OpenAI.GPT_5,
31+
aiConfiguration(AIModel_Claude.Opus_4_1),
32+
aiConfiguration(AIModel_Gemini.Pro_2_5),
33+
)
34+
},
3435
)

shared/src/commonMain/kotlin/link/socket/kore/domain/agent/bundled/CareerAgent.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package link.socket.kore.domain.agent.bundled
22

3-
import link.socket.kore.domain.ai.aiConfiguration
4-
import link.socket.kore.domain.llm.LLM_Claude
5-
import link.socket.kore.domain.llm.LLM_Gemini
6-
import link.socket.kore.domain.llm.LLM_OpenAI
3+
import link.socket.kore.domain.ai.model.AIModel_Claude
4+
import link.socket.kore.domain.ai.model.AIModel_Gemini
5+
import link.socket.kore.domain.ai.model.AIModel_OpenAI
76

87
private const val NAME: String = "Career Coach"
98
private const val DESCRIPTION = "Career coaching agent that provides comprehensive job search guidance including interview preparation, resume building, networking strategies, and career goal setting"
@@ -29,9 +28,11 @@ data object CareerAgent : AgentDefinition.Bundled(
2928
name = NAME,
3029
description = DESCRIPTION,
3130
prompt = PROMPT,
32-
aiConfiguration = aiConfiguration(
33-
LLM_Claude.Sonnet_4,
34-
aiConfiguration(LLM_OpenAI.GPT_5_mini),
35-
aiConfiguration(LLM_Gemini.Flash_2_5),
36-
),
31+
defaultAIConfigurationBuilder = {
32+
aiConfiguration(
33+
AIModel_Claude.Sonnet_4,
34+
aiConfiguration(AIModel_OpenAI.GPT_5_mini),
35+
aiConfiguration(AIModel_Gemini.Flash_2_5),
36+
)
37+
},
3738
)

0 commit comments

Comments
 (0)