8f11340b38
Per post_module_taxonomy_de_cruft_20260627 Phase 2 (FR7). Each
'from src.models import X' for a moved class is rewritten to
'from src.<destination> import X':
Ticket, Track, WorkerContext, TrackState, TrackMetadata,
ThinkingSegment, EMPTY_TRACK_STATE -> src.mma
ProjectContext, ProjectMeta, ProjectOutput, ProjectFiles,
ProjectScreenshots, ProjectDiscussion, EMPTY_PROJECT_CONTEXT -> src.project
FileItem, Preset, ContextPreset, ContextFileEntry,
NamedViewPreset -> src.project_files
Tool, ToolPreset -> src.tool_presets
BiasProfile -> src.tool_bias
TextEditorConfig, ExternalEditorConfig,
EMPTY_TEXT_EDITOR_CONFIG -> src.external_editor
Persona -> src.personas
WorkspaceProfile -> src.workspace_manager
MCPServerConfig, MCPConfiguration, VectorStoreConfig,
RAGConfig, load_mcp_config -> src.mcp_client
NOT touched (kept on src.models; Phase 3 or Phase 4 will move them):
GenerateRequest, ConfirmRequest, DEFAULT_TOOL_CATEGORIES, Metadata, PROVIDERS
Migration was performed by the one-time script
scripts/tier2/artifacts/post_module_taxonomy_de_cruft_20260627/migrate_imports.py
which uses a class-to-module map and re.sub() to rewrite each
'from src.models import X' line.
Total: 85 import lines rewritten across 71 files.
Note: this commit depends on the v2 SHIPPED work
(origin/tier2/module_taxonomy_refactor_20260627) being merged into
this branch NEXT. On master (without the v2 SHIPPED commits), the
destination modules do not exist and these imports would fail.
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
import pytest
|
|
from src.personas import Persona
|
|
|
|
def test_persona_serialization():
|
|
persona = Persona(
|
|
name="SecuritySpecialist",
|
|
preferred_models=[
|
|
{"provider": "anthropic", "model": "claude-3-7-sonnet-20250219", "temperature": 0.2, "top_p": 0.9, "max_output_tokens": 4000},
|
|
"claude-3-5-sonnet-20241022"
|
|
],
|
|
system_prompt="You are a security expert.",
|
|
tool_preset="SecurityTools",
|
|
bias_profile="Execution-Focused"
|
|
)
|
|
|
|
assert persona.provider == "anthropic"
|
|
assert persona.model == "claude-3-7-sonnet-20250219"
|
|
assert persona.temperature == 0.2
|
|
assert persona.top_p == 0.9
|
|
assert persona.max_output_tokens == 4000
|
|
|
|
data = persona.to_dict()
|
|
|
|
# data should NOT have top-level provider/model anymore, it's in preferred_models
|
|
assert "provider" not in data
|
|
assert "model" not in data
|
|
assert data["preferred_models"][0]["provider"] == "anthropic"
|
|
assert data["preferred_models"][0]["model"] == "claude-3-7-sonnet-20250219"
|
|
assert data["preferred_models"][1] == {"model": "claude-3-5-sonnet-20241022"}
|
|
assert data["system_prompt"] == "You are a security expert."
|
|
assert data["preferred_models"][0]["temperature"] == 0.2
|
|
assert data["preferred_models"][0]["top_p"] == 0.9
|
|
assert data["preferred_models"][0]["max_output_tokens"] == 4000
|
|
assert data["tool_preset"] == "SecurityTools"
|
|
assert data["bias_profile"] == "Execution-Focused"
|
|
|
|
def test_persona_deserialization():
|
|
# Old config format (legacy)
|
|
data = {
|
|
"provider": "gemini",
|
|
"model": "gemini-2.5-flash",
|
|
"preferred_models": ["gemini-2.5-flash"],
|
|
"system_prompt": "You are a helpful assistant.",
|
|
"temperature": 0.5,
|
|
"top_p": 1.0,
|
|
"max_output_tokens": 8192,
|
|
"tool_preset": "Default",
|
|
"bias_profile": "Balanced"
|
|
}
|
|
|
|
persona = Persona.from_dict("Assistant", data)
|
|
|
|
assert persona.name == "Assistant"
|
|
assert persona.provider == "gemini"
|
|
assert persona.model == "gemini-2.5-flash"
|
|
# Migration logic should have put legacy fields into preferred_models since it only had a string
|
|
assert persona.preferred_models[0]["provider"] == "gemini"
|
|
assert persona.preferred_models[0]["model"] == "gemini-2.5-flash"
|
|
assert persona.system_prompt == "You are a helpful assistant."
|
|
assert persona.temperature == 0.5
|
|
assert persona.top_p == 1.0
|
|
assert persona.max_output_tokens == 8192
|
|
assert persona.tool_preset == "Default"
|
|
assert persona.bias_profile == "Balanced"
|
|
|
|
def test_persona_defaults():
|
|
persona = Persona(name="Minimal", system_prompt="Just the basics")
|
|
assert persona.provider == ""
|
|
assert persona.model == ""
|
|
assert persona.preferred_models == []
|
|
assert persona.temperature == 0.0
|
|
assert persona.tool_preset is None
|
|
|
|
data = persona.to_dict()
|
|
assert "provider" not in data
|
|
assert "preferred_models" not in data
|
|
assert "temperature" not in data
|
|
|
|
loaded = Persona.from_dict("Minimal", data)
|
|
assert loaded.preferred_models == []
|