4040 mount_skill_creator_routes ,
4141)
4242
43- _RELAY_URL = "https://test.apigateway- cn-beijing.volceapi .com/api/v3"
43+ _MODEL_BASE_URL = "https://ark. cn-beijing.volces .com/api/v3"
4444
4545
4646def _skill_zip (name : str = "weather-report" ) -> bytes :
@@ -101,15 +101,15 @@ def create_candidate(
101101 request : str ,
102102 ) -> dict [str , str ]:
103103 del tool_id , job_id , label , request
104- assert model_base_url == _RELAY_URL
104+ assert model_base_url == _MODEL_BASE_URL
105105 calls .append ((candidate_id , model ))
106106 return {"instanceId" : f"instance-{ candidate_id } " , "endpoint" : "endpoint" }
107107
108108 with (
109109 patch .object (
110110 service ,
111111 "_validate_tool" ,
112- return_value = _RELAY_URL ,
112+ return_value = _MODEL_BASE_URL ,
113113 ),
114114 patch .object (service , "_create_candidate" , side_effect = create_candidate ),
115115 ):
@@ -275,7 +275,7 @@ def create_candidate(*args: object, **kwargs: object) -> dict[str, str]:
275275 patch .object (
276276 service ,
277277 "_validate_tool" ,
278- return_value = _RELAY_URL ,
278+ return_value = _MODEL_BASE_URL ,
279279 ),
280280 patch .object (service , "_create_candidate" , side_effect = create_candidate ),
281281 patch .object (service , "_delete_instances" ) as delete_instances ,
@@ -329,50 +329,58 @@ def test_archive_metadata_rejects_symlink_entry() -> None:
329329 SkillCreatorService (tool_id = "tool-id" )._archive_metadata (output .getvalue ())
330330
331331
332- def test_credential_hosting_is_bound_to_tool_without_raw_key () -> None :
332+ def test_model_credential_is_bound_directly_to_tool () -> None :
333+ access_key = os .urandom (16 ).hex ()
334+ model_api_key = os .urandom (24 ).hex ()
335+ secret_key = os .urandom (24 ).hex ()
336+ calls : list [tuple [str , dict [str , object ]]] = []
337+
333338 class FakeApi :
334- def call (self , * _args : object , ** _kwargs : object ) -> dict [str , object ]:
335- return {
336- "Tool" : {
337- "Envs" : [
338- {"Key" : "CODEX_API_KEY" , "Value" : "raw-key" },
339- {"Key" : "CODEX_BASE_URL" , "Value" : "https://ark.example" },
340- ]
339+ def call (
340+ self ,
341+ _service : str ,
342+ action : str ,
343+ _version : str ,
344+ body : dict [str , object ],
345+ ) -> dict [str , object ]:
346+ calls .append ((action , body ))
347+ if action == "GetTool" :
348+ return {
349+ "Tool" : {"Envs" : [{"Key" : "EXISTING_ENV" , "Value" : "preserved" }]}
341350 }
342- }
351+ return { }
343352
344- updates : dict [str , str ] = {}
345353 with (
346354 patch ("agentkit.auth._openapi.OpenApiClient" , return_value = FakeApi ()),
347355 patch (
348- "agentkit.auth.credential_hosting.list_gateways" ,
349- return_value = [{"id" : "gateway-id" , "name" : "agentkit-credhost-gw" }],
350- ),
351- patch ("veadk.auth.veauth.ark_veauth.get_ark_token" , return_value = "raw-key" ),
352- patch (
353- "agentkit.auth.credential_hosting.host_model_key" ,
354- return_value = SimpleNamespace (
355- ticket = "ck-hosted-ticket" ,
356- model_base_url = _RELAY_URL ,
357- ),
358- ),
359- patch (
360- "agentkit.auth.credential_hosting.set_tool_env" ,
361- side_effect = lambda _api , _tool_id , values : updates .update (values ),
362- ),
356+ "veadk.auth.veauth.ark_veauth.get_ark_token" ,
357+ return_value = model_api_key ,
358+ ) as get_ark_token ,
363359 ):
364360 ensure_skill_creator_model_credential (
365361 tool_id = "tool-id" ,
366- access_key = "access-key" ,
367- secret_key = "secret-key" ,
362+ access_key = access_key ,
363+ secret_key = secret_key ,
368364 )
369365
370- assert updates ["CODEX_API_KEY" ] == "ck-hosted-ticket"
371- assert updates ["CODEX_BASE_URL" ] == _RELAY_URL
372- assert "raw-key" not in updates .values ()
366+ get_ark_token .assert_called_once_with (
367+ region = "cn-beijing" ,
368+ access_key = access_key ,
369+ secret_key = secret_key ,
370+ session_token = None ,
371+ )
372+ assert [action for action , _ in calls ] == ["GetTool" , "UpdateTool" ]
373+ update_body = calls [1 ][1 ]
374+ envs = {
375+ item ["Key" ]: item ["Value" ]
376+ for item in cast (list [dict [str , str ]], update_body ["Envs" ])
377+ }
378+ assert envs ["EXISTING_ENV" ] == "preserved"
379+ assert envs ["CODEX_API_KEY" ] == model_api_key
380+ assert envs ["CODEX_BASE_URL" ] == _MODEL_BASE_URL
373381
374382
375- def test_candidate_session_never_overrides_hosted_tool_ticket (monkeypatch ) -> None :
383+ def test_candidate_session_never_overrides_tool_model_credential (monkeypatch ) -> None :
376384 service = SkillCreatorService (tool_id = "tool-id" )
377385 captured : dict [str , object ] = {}
378386
@@ -400,7 +408,7 @@ def delete_session(self, _request: object) -> None:
400408 "a" ,
401409 "doubao-seed-2-0-pro-260215" ,
402410 "豆包 Seed 2.0 Pro" ,
403- _RELAY_URL ,
411+ _MODEL_BASE_URL ,
404412 "Create a release notes Skill" ,
405413 )
406414
@@ -412,21 +420,21 @@ def delete_session(self, _request: object) -> None:
412420 )
413421
414422
415- def test_tool_rejects_untrusted_credential_relay_url () -> None :
423+ def test_tool_rejects_untrusted_model_base_url () -> None :
416424 service = SkillCreatorService (tool_id = "tool-id" )
417425 tool = SimpleNamespace (
418426 tool_type = "CodeEnv" ,
419427 status = "Ready" ,
420428 envs = [
421- SimpleNamespace (key = "CODEX_API_KEY" , value = "ck-hosted-ticket" ),
429+ SimpleNamespace (key = "CODEX_API_KEY" , value = os . urandom ( 24 ). hex () ),
422430 SimpleNamespace (
423431 key = "CODEX_BASE_URL" , value = "http://attacker.invalid/api/v3"
424432 ),
425433 ],
426434 )
427435 with (
428436 patch ("veadk.cli.frontend_skill_creator.AgentkitToolsClient" ) as client_class ,
429- pytest .raises (SkillCreatorError , match = "中继地址无效 " ),
437+ pytest .raises (SkillCreatorError , match = "模型服务地址无效 " ),
430438 ):
431439 client_class .return_value .get_tool .return_value = tool
432440 service ._validate_tool ("tool-id" )
@@ -457,3 +465,21 @@ def test_skill_creator_reads_only_dedicated_sandbox_tool_env(monkeypatch) -> Non
457465 monkeypatch .delenv ("SANDBOX_SKILL_CREATOR" )
458466 with pytest .raises (SkillCreatorError , match = "管理员未配置" ):
459467 SkillCreatorService ()._tool_id ()
468+
469+
470+ def test_skill_creator_uses_configured_sandbox_region (monkeypatch ) -> None :
471+ monkeypatch .setenv ("AGENTKIT_SANDBOX_REGION" , "cn-shanghai" )
472+ tool = SimpleNamespace (
473+ tool_type = "CodeEnv" ,
474+ status = "Ready" ,
475+ envs = [
476+ SimpleNamespace (key = "CODEX_API_KEY" , value = os .urandom (24 ).hex ()),
477+ SimpleNamespace (key = "CODEX_BASE_URL" , value = _MODEL_BASE_URL ),
478+ ],
479+ )
480+ with patch ("veadk.cli.frontend_skill_creator.AgentkitToolsClient" ) as client_class :
481+ client_class .return_value .get_tool .return_value = tool
482+
483+ SkillCreatorService (tool_id = "tool-id" )._validate_tool ("tool-id" )
484+
485+ client_class .assert_called_once_with (region = "cn-shanghai" )
0 commit comments