Skip to content

Commit 48c006e

Browse files
committed
feat(demo): add model selector with API key detection and RAG parameters
Settings Panel Enhancements: - Add provider dropdown filtered by API key availability - Add model dropdown populated based on selected provider - Add chunk size slider (200-2000) - Add chunk overlap slider (0-500) - Add similarity threshold slider (0.0-1.0) ModelRegistry: - Checks environment variables, system properties, and application.properties - Filters out placeholder keys starting with "YOUR_" - Provides list of models per provider (OpenAI, Anthropic, Azure, Ollama) Test Fix: - Add @BeforeAll precondition check for LangCacheIntegrationTest - Uses JUnit Assumptions to skip when API not configured
1 parent 710b57f commit 48c006e

File tree

4 files changed

+477
-37
lines changed

4 files changed

+477
-37
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.redis.vl.demo.rag.model;
2+
3+
import com.redis.vl.demo.rag.config.AppConfig;
4+
import java.util.ArrayList;
5+
import java.util.EnumMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
/**
10+
* Registry of available LLM providers and models.
11+
*
12+
* <p>Filters providers based on API key availability in environment variables
13+
* or application.properties.
14+
*/
15+
public class ModelRegistry {
16+
17+
private static final Map<LLMConfig.Provider, List<String>> PROVIDER_MODELS = new EnumMap<>(LLMConfig.Provider.class);
18+
19+
static {
20+
// OpenAI models
21+
PROVIDER_MODELS.put(LLMConfig.Provider.OPENAI, List.of(
22+
"gpt-4o",
23+
"gpt-4o-mini",
24+
"gpt-4-turbo",
25+
"gpt-4",
26+
"gpt-3.5-turbo"
27+
));
28+
29+
// Anthropic models
30+
PROVIDER_MODELS.put(LLMConfig.Provider.ANTHROPIC, List.of(
31+
"claude-3-5-sonnet-20241022",
32+
"claude-3-5-haiku-20241022",
33+
"claude-3-opus-20240229",
34+
"claude-3-sonnet-20240229",
35+
"claude-3-haiku-20240307"
36+
));
37+
38+
// Azure OpenAI - uses deployment names, typically configured per environment
39+
PROVIDER_MODELS.put(LLMConfig.Provider.AZURE, List.of(
40+
"gpt-4o",
41+
"gpt-4",
42+
"gpt-35-turbo"
43+
));
44+
45+
// Ollama - local models
46+
PROVIDER_MODELS.put(LLMConfig.Provider.OLLAMA, List.of(
47+
"llama3.2-vision",
48+
"llama3.2",
49+
"llama3.1",
50+
"mistral",
51+
"mixtral"
52+
));
53+
}
54+
55+
/**
56+
* Gets providers that have valid API keys configured.
57+
*
58+
* @return List of available providers
59+
*/
60+
public static List<LLMConfig.Provider> getAvailableProviders() {
61+
List<LLMConfig.Provider> available = new ArrayList<>();
62+
63+
for (LLMConfig.Provider provider : LLMConfig.Provider.values()) {
64+
if (isProviderAvailable(provider)) {
65+
available.add(provider);
66+
}
67+
}
68+
69+
return available;
70+
}
71+
72+
/**
73+
* Checks if a provider is available based on API key.
74+
*
75+
* @param provider Provider to check
76+
* @return true if available
77+
*/
78+
public static boolean isProviderAvailable(LLMConfig.Provider provider) {
79+
if (!provider.requiresApiKey()) {
80+
return true; // Ollama doesn't require API key
81+
}
82+
83+
String apiKey = getApiKeyForProvider(provider);
84+
return apiKey != null && !apiKey.isEmpty() && !apiKey.startsWith("YOUR_");
85+
}
86+
87+
/**
88+
* Gets API key for a provider from environment variables or application.properties.
89+
*
90+
* @param provider Provider
91+
* @return API key or null
92+
*/
93+
public static String getApiKeyForProvider(LLMConfig.Provider provider) {
94+
return switch (provider) {
95+
case OPENAI -> getApiKey("OPENAI_API_KEY", "openai.api.key");
96+
case ANTHROPIC -> getApiKey("ANTHROPIC_API_KEY", "anthropic.api.key");
97+
case AZURE -> getApiKey("AZURE_OPENAI_API_KEY", "azure.api.key");
98+
case OLLAMA -> null; // No API key needed
99+
};
100+
}
101+
102+
private static String getApiKey(String envVar, String property) {
103+
// First check environment variable
104+
String value = System.getenv(envVar);
105+
if (value != null && !value.isEmpty()) {
106+
return value;
107+
}
108+
// Then check system property
109+
value = System.getProperty(property);
110+
if (value != null && !value.isEmpty()) {
111+
return value;
112+
}
113+
// Finally check application.properties via AppConfig
114+
AppConfig config = AppConfig.getInstance();
115+
return config.getProperty(property, null);
116+
}
117+
118+
/**
119+
* Gets models available for a provider.
120+
*
121+
* @param provider Provider
122+
* @return List of model names
123+
*/
124+
public static List<String> getModelsForProvider(LLMConfig.Provider provider) {
125+
return PROVIDER_MODELS.getOrDefault(provider, List.of(provider.getDefaultModel()));
126+
}
127+
128+
/**
129+
* Gets the default model for a provider.
130+
*
131+
* @param provider Provider
132+
* @return Default model name
133+
*/
134+
public static String getDefaultModel(LLMConfig.Provider provider) {
135+
List<String> models = getModelsForProvider(provider);
136+
return models.isEmpty() ? provider.getDefaultModel() : models.get(0);
137+
}
138+
}

0 commit comments

Comments
 (0)