88
99from pygls import uris
1010
11+ from codeflash .api .cfapi import get_codeflash_api_key , get_user_id
12+ from codeflash .code_utils .shell_utils import save_api_key_to_rc
1113from codeflash .either import is_successful
1214from codeflash .lsp .server import CodeflashLanguageServer , CodeflashLanguageServerProtocol
1315
@@ -28,6 +30,11 @@ class FunctionOptimizationParams:
2830 functionName : str # noqa: N815
2931
3032
33+ @dataclass
34+ class ProvideApiKeyParams :
35+ api_key : str
36+
37+
3138server = CodeflashLanguageServer ("codeflash-language-server" , "v1.0" , protocol_cls = CodeflashLanguageServerProtocol )
3239
3340
@@ -118,6 +125,53 @@ def discover_function_tests(server: CodeflashLanguageServer, params: FunctionOpt
118125 return {"functionName" : params .functionName , "status" : "success" , "discovered_tests" : num_discovered_tests }
119126
120127
128+ def _initialize_optimizer_if_valid (server : CodeflashLanguageServer ) -> dict [str , str ]:
129+ user_id = get_user_id ()
130+ if user_id is None :
131+ return {"status" : "error" , "message" : "api key not found or invalid" }
132+
133+ if user_id .startswith ("Error: " ):
134+ error_msg = user_id [7 :]
135+ return {"status" : "error" , "message" : error_msg }
136+
137+ from codeflash .optimization .optimizer import Optimizer
138+
139+ server .optimizer = Optimizer (server .args )
140+ return {"status" : "success" , "user_id" : user_id }
141+
142+
143+ @server .feature ("apiKeyExistsAndValid" )
144+ def check_api_key (server : CodeflashLanguageServer , _params : any ) -> dict [str , str ]:
145+ try :
146+ return _initialize_optimizer_if_valid (server )
147+ except Exception :
148+ return {"status" : "error" , "message" : "something went wrong while validating the api key" }
149+
150+
151+ @server .feature ("provideApiKey" )
152+ def provide_api_key (server : CodeflashLanguageServer , params : ProvideApiKeyParams ) -> dict [str , str ]:
153+ try :
154+ api_key = params .api_key
155+ if not api_key .startswith ("cf-" ):
156+ return {"status" : "error" , "message" : "Api key is not valid" }
157+
158+ result = save_api_key_to_rc (api_key )
159+ if not is_successful (result ):
160+ return {"status" : "error" , "message" : result .failure ()}
161+
162+ # clear cache to ensure the new api key is used
163+ get_codeflash_api_key .cache_clear ()
164+ get_user_id .cache_clear ()
165+
166+ init_result = _initialize_optimizer_if_valid (server )
167+ if init_result ["status" ] == "error" :
168+ return {"status" : "error" , "message" : "Api key is not valid" }
169+
170+ return {"status" : "success" , "message" : "Api key saved successfully" , "user_id" : init_result ["user_id" ]}
171+ except Exception :
172+ return {"status" : "error" , "message" : "something went wrong while saving the api key" }
173+
174+
121175@server .feature ("prepareOptimization" )
122176def prepare_optimization (server : CodeflashLanguageServer , params : FunctionOptimizationParams ) -> dict [str , str ]:
123177 current_function = server .optimizer .current_function_being_optimized
0 commit comments