81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from ai_orchestrator.config import (
|
|
ExecutionConfig,
|
|
ModelsConfig,
|
|
ModelSlotConfig,
|
|
PolicyConfig,
|
|
PolicyMode,
|
|
ProjectConfig,
|
|
ProjectMetadata,
|
|
)
|
|
from ai_orchestrator.domain.enums import PolicyDecisionType, RiskLevel
|
|
from ai_orchestrator.domain.models import ActionDescriptor
|
|
from ai_orchestrator.infrastructure.policy import StaticProjectPolicyEvaluator
|
|
|
|
|
|
def test_policy_evaluator_returns_confirm_for_configured_resource() -> None:
|
|
project = ProjectConfig(
|
|
project=ProjectMetadata(id="default", name="Default"),
|
|
models=ModelsConfig(
|
|
weak=ModelSlotConfig(provider="local", model="weak"),
|
|
strong=ModelSlotConfig(provider="local", model="strong"),
|
|
vision=ModelSlotConfig(provider="disabled"),
|
|
embedding=ModelSlotConfig(provider="local", model="embed"),
|
|
),
|
|
execution=ExecutionConfig(),
|
|
policy=PolicyConfig(),
|
|
)
|
|
evaluator = StaticProjectPolicyEvaluator(projects={"default": project})
|
|
|
|
decision = evaluator.evaluate(
|
|
ActionDescriptor(
|
|
resource="filesystem",
|
|
risk_level=RiskLevel.WRITE,
|
|
action_name="file.write",
|
|
preview_available=True,
|
|
),
|
|
"default",
|
|
)
|
|
|
|
assert decision.decision == PolicyDecisionType.CONFIRM
|
|
assert decision.requires_confirmation is True
|
|
|
|
|
|
def test_policy_evaluator_returns_disabled_by_config() -> None:
|
|
project = ProjectConfig(
|
|
project=ProjectMetadata(id="default", name="Default"),
|
|
models=ModelsConfig(
|
|
weak=ModelSlotConfig(provider="local", model="weak"),
|
|
strong=ModelSlotConfig(provider="local", model="strong"),
|
|
vision=ModelSlotConfig(provider="disabled"),
|
|
embedding=ModelSlotConfig(provider="local", model="embed"),
|
|
),
|
|
execution=ExecutionConfig(),
|
|
policy=PolicyConfig(
|
|
default_mode=PolicyMode.CONFIRM,
|
|
resources={
|
|
"filesystem": PolicyMode.CONFIRM,
|
|
"shell": PolicyMode.CONFIRM,
|
|
"sql": PolicyMode.CONFIRM,
|
|
"mcp": PolicyMode.CONFIRM,
|
|
"external_models": PolicyMode.DISABLED,
|
|
"desktop": PolicyMode.CONFIRM,
|
|
"browser": PolicyMode.CONFIRM,
|
|
"network": PolicyMode.CONFIRM,
|
|
"cost": PolicyMode.CONFIRM,
|
|
"system": PolicyMode.CONFIRM,
|
|
},
|
|
),
|
|
)
|
|
evaluator = StaticProjectPolicyEvaluator(projects={"default": project})
|
|
|
|
decision = evaluator.evaluate(
|
|
ActionDescriptor(
|
|
resource="external_models",
|
|
risk_level=RiskLevel.COST,
|
|
action_name="model.external",
|
|
),
|
|
"default",
|
|
)
|
|
|
|
assert decision.decision == PolicyDecisionType.DISABLED_BY_CONFIG
|