@@ -36,6 +36,9 @@ class Env(BaseSettings):
3636 LITELLM_API_BASE : str = "http://localhost:4000"
3737 CHALLENGE_EXPIRY_SECONDS : int = 300 # 5 minutes
3838
39+ # Search allowed service types
40+ SEARCH_ALLOWED_SERVICE_TYPES : set [str ] = {"search" , "search-dev" }
41+
3942 # User Feature Budget - AI service type
4043 USER_FEATURE_BUDGET_AI_BUDGET_ID : str = "end-user-budget-ai"
4144 USER_FEATURE_BUDGET_AI_MAX_BUDGET : float = 0.1
@@ -64,6 +67,18 @@ class Env(BaseSettings):
6467 USER_FEATURE_BUDGET_MEMORIES_TPM_LIMIT : int = 2000
6568 USER_FEATURE_BUDGET_MEMORIES_BUDGET_DURATION : str = "1d"
6669
70+ USER_FEATURE_BUDGET_SEARCH_BUDGET_ID : str = "end-user-budget-search"
71+ USER_FEATURE_BUDGET_SEARCH_MAX_BUDGET : float = 0.1
72+ USER_FEATURE_BUDGET_SEARCH_RPM_LIMIT : int = 10
73+ USER_FEATURE_BUDGET_SEARCH_TPM_LIMIT : int = 2000
74+ USER_FEATURE_BUDGET_SEARCH_BUDGET_DURATION : str = "1d"
75+
76+ USER_FEATURE_BUDGET_TELEMETRY_BUDGET_ID : str = "end-user-budget-telemetry"
77+ USER_FEATURE_BUDGET_TELEMETRY_MAX_BUDGET : float = 0.1
78+ USER_FEATURE_BUDGET_TELEMETRY_RPM_LIMIT : int = 10
79+ USER_FEATURE_BUDGET_TELEMETRY_TPM_LIMIT : int = 2000
80+ USER_FEATURE_BUDGET_TELEMETRY_BUDGET_DURATION : str = "1d"
81+
6782 # User Feature Budget - ai-dev service type (experimentation, batch predictions)
6883 USER_FEATURE_BUDGET_AI_DEV_BUDGET_ID : str = "end-user-budget-ai-dev"
6984 USER_FEATURE_BUDGET_AI_DEV_MAX_BUDGET : float = 1.0
@@ -84,17 +99,11 @@ class Env(BaseSettings):
8499 USER_FEATURE_BUDGET_MOCHI_DEV_TPM_LIMIT : int = 10000
85100 USER_FEATURE_BUDGET_MOCHI_DEV_BUDGET_DURATION : str = "1d"
86101
87- USER_FEATURE_BUDGET_SEARCH_BUDGET_ID : str = "end-user-budget-search"
88- USER_FEATURE_BUDGET_SEARCH_MAX_BUDGET : float = 0.1
89- USER_FEATURE_BUDGET_SEARCH_RPM_LIMIT : int = 10
90- USER_FEATURE_BUDGET_SEARCH_TPM_LIMIT : int = 2000
91- USER_FEATURE_BUDGET_SEARCH_BUDGET_DURATION : str = "1d"
92-
93- USER_FEATURE_BUDGET_TELEMETRY_BUDGET_ID : str = "end-user-budget-telemetry"
94- USER_FEATURE_BUDGET_TELEMETRY_MAX_BUDGET : float = 0.1
95- USER_FEATURE_BUDGET_TELEMETRY_RPM_LIMIT : int = 10
96- USER_FEATURE_BUDGET_TELEMETRY_TPM_LIMIT : int = 2000
97- USER_FEATURE_BUDGET_TELEMETRY_BUDGET_DURATION : str = "1d"
102+ USER_FEATURE_BUDGET_SEARCH_DEV_BUDGET_ID : str = "end-user-budget-search-dev"
103+ USER_FEATURE_BUDGET_SEARCH_DEV_MAX_BUDGET : float = 1.0
104+ USER_FEATURE_BUDGET_SEARCH_DEV_RPM_LIMIT : int = 200
105+ USER_FEATURE_BUDGET_SEARCH_DEV_TPM_LIMIT : int = 10000
106+ USER_FEATURE_BUDGET_SEARCH_DEV_BUDGET_DURATION : str = "1d"
98107
99108 @cached_property
100109 def user_feature_budget (self ) -> dict [str , dict ]:
@@ -132,6 +141,20 @@ def user_feature_budget(self) -> dict[str, dict]:
132141 "tpm_limit" : self .USER_FEATURE_BUDGET_MEMORIES_TPM_LIMIT ,
133142 "budget_duration" : self .USER_FEATURE_BUDGET_MEMORIES_BUDGET_DURATION ,
134143 },
144+ "search" : {
145+ "budget_id" : self .USER_FEATURE_BUDGET_SEARCH_BUDGET_ID ,
146+ "max_budget" : self .USER_FEATURE_BUDGET_SEARCH_MAX_BUDGET ,
147+ "rpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_RPM_LIMIT ,
148+ "tpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_TPM_LIMIT ,
149+ "budget_duration" : self .USER_FEATURE_BUDGET_SEARCH_BUDGET_DURATION ,
150+ },
151+ "telemetry" : {
152+ "budget_id" : self .USER_FEATURE_BUDGET_TELEMETRY_BUDGET_ID ,
153+ "max_budget" : self .USER_FEATURE_BUDGET_TELEMETRY_MAX_BUDGET ,
154+ "rpm_limit" : self .USER_FEATURE_BUDGET_TELEMETRY_RPM_LIMIT ,
155+ "tpm_limit" : self .USER_FEATURE_BUDGET_TELEMETRY_TPM_LIMIT ,
156+ "budget_duration" : self .USER_FEATURE_BUDGET_TELEMETRY_BUDGET_DURATION ,
157+ },
135158 "ai-dev" : {
136159 "budget_id" : self .USER_FEATURE_BUDGET_AI_DEV_BUDGET_ID ,
137160 "max_budget" : self .USER_FEATURE_BUDGET_AI_DEV_MAX_BUDGET ,
@@ -153,19 +176,12 @@ def user_feature_budget(self) -> dict[str, dict]:
153176 "tpm_limit" : self .USER_FEATURE_BUDGET_MOCHI_DEV_TPM_LIMIT ,
154177 "budget_duration" : self .USER_FEATURE_BUDGET_MOCHI_DEV_BUDGET_DURATION ,
155178 },
156- "search" : {
157- "budget_id" : self .USER_FEATURE_BUDGET_SEARCH_BUDGET_ID ,
158- "max_budget" : self .USER_FEATURE_BUDGET_SEARCH_MAX_BUDGET ,
159- "rpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_RPM_LIMIT ,
160- "tpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_TPM_LIMIT ,
161- "budget_duration" : self .USER_FEATURE_BUDGET_SEARCH_BUDGET_DURATION ,
162- },
163- "telemetry" : {
164- "budget_id" : self .USER_FEATURE_BUDGET_TELEMETRY_BUDGET_ID ,
165- "max_budget" : self .USER_FEATURE_BUDGET_TELEMETRY_MAX_BUDGET ,
166- "rpm_limit" : self .USER_FEATURE_BUDGET_TELEMETRY_RPM_LIMIT ,
167- "tpm_limit" : self .USER_FEATURE_BUDGET_TELEMETRY_TPM_LIMIT ,
168- "budget_duration" : self .USER_FEATURE_BUDGET_TELEMETRY_BUDGET_DURATION ,
179+ "search-dev" : {
180+ "budget_id" : self .USER_FEATURE_BUDGET_SEARCH_DEV_BUDGET_ID ,
181+ "max_budget" : self .USER_FEATURE_BUDGET_SEARCH_DEV_MAX_BUDGET ,
182+ "rpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_DEV_RPM_LIMIT ,
183+ "tpm_limit" : self .USER_FEATURE_BUDGET_SEARCH_DEV_TPM_LIMIT ,
184+ "budget_duration" : self .USER_FEATURE_BUDGET_SEARCH_DEV_BUDGET_DURATION ,
169185 },
170186 }
171187
@@ -197,6 +213,7 @@ def service_type_purposes(self) -> dict[str, list[str]]:
197213 "s2s" : [],
198214 "s2s-android" : [],
199215 "search" : [],
216+ "search-dev" : [],
200217 "telemetry" : telemetry_purposes ,
201218 }
202219
@@ -214,7 +231,7 @@ def forced_model_service_type_pairs(self) -> dict[str, list[str]]:
214231 Returns a dictionary mapping model names to their valid service types.
215232 """
216233 # Force certain models to use certain service types
217- return {"exa" : ["search" ]}
234+ return {"exa" : ["search" , "search-dev" ]}
218235
219236 def valid_service_type_for_model (self , service_type : str , model : str ) -> bool :
220237 """Check if a service type is valid for a specific model."""
0 commit comments