dlgforge.config.personas¶
Persona loading, formatting, and sampling utilities.
UniformPersonaSampler(user_personas, assistant_personas, rng)
¶
Cycle-based sampler for user/assistant personas.
The sampler shuffles each persona pool and pops items until exhausted, then reshuffles. This prevents early repetition while keeping distribution near uniform over long runs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
user_personas
|
List[Dict[str, Any]]
|
User persona records. |
required |
assistant_personas
|
List[Dict[str, Any]]
|
Assistant persona records. |
required |
rng
|
Random
|
Random generator used for deterministic shuffling. |
required |
Side Effects / I/O: - Mutates internal in-memory cycles as samples are drawn.
Preconditions / Invariants: - Persona entries are expected to be mapping-like objects. - Empty pools are supported and return empty persona text/ids.
Examples:
>>> from dlgforge.config.personas import UniformPersonaSampler
>>> import random
>>> sampler = UniformPersonaSampler([{"id": "u1"}], [{"id": "a1"}], random.Random(7))
>>> sampler.sample()[2]["user_id"]
'u1'
sample()
¶
Sample one user persona and one assistant persona.
Returns:
| Type | Description |
|---|---|
str
|
Tuple[str, str, Dict[str, str]]: `(user_text, assistant_text, |
str
|
metadata) |
Side Effects / I/O: - Advances in-memory sampling cycles.
Examples:
>>> from dlgforge.config.personas import UniformPersonaSampler
>>> import random
>>> sampler = UniformPersonaSampler([{"id": "u1"}], [{"id": "a1"}], random.Random(0))
>>> sample = sampler.sample()
>>> sample[2]["assistant_id"]
'a1'
select_personas(cfg, project_root, config_path)
¶
Select one user persona and one assistant persona for a conversation.
Returns empty values when personas are disabled.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
project_root
|
Path
|
Project root used for resolving relative paths. |
required |
config_path
|
Path
|
Path to the active config file. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Tuple[str, str, Dict[str, str]]: `(user_text, assistant_text, |
str
|
metadata)` with selected persona ids in metadata. |
Side Effects / I/O: - Reads persona files when persona loading is enabled.
Examples:
>>> from dlgforge.config.personas import select_personas
>>> select_personas(...)
resolve_personas_enabled(cfg)
¶
Return whether persona sampling is enabled in configuration.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
bool |
bool
|
|
Examples:
>>> from dlgforge.config.personas import resolve_personas_enabled
>>> resolve_personas_enabled({"personas": {"enabled": True}})
True
resolve_personas_path(cfg)
¶
Return the configured personas file path.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
Raw value of |
Examples:
>>> from dlgforge.config.personas import resolve_personas_path
>>> resolve_personas_path({"personas": {"path": "data/personas.yaml"}})
'data/personas.yaml'
resolve_question_seed(cfg)
¶
Return the run-level question seed used for persona RNG initialization.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
Value of |
Examples:
>>> from dlgforge.config.personas import resolve_question_seed
>>> resolve_question_seed({"run": {"question_seed": "seed-1"}})
'seed-1'
build_persona_rng(cfg)
¶
Build a deterministic RNG for persona selection.
Uses run.question_seed when present; otherwise falls back to current UTC
timestamp for non-deterministic runs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
Returns:
| Type | Description |
|---|---|
Random
|
random.Random: RNG seeded with a persona-specific seed namespace. |
Examples:
>>> from dlgforge.config.personas import build_persona_rng
>>> build_persona_rng(...)
build_uniform_persona_sampler(cfg, project_root, config_path)
¶
Build a UniformPersonaSampler from config and persona assets.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
project_root
|
Path
|
Project root used for resolving relative paths. |
required |
config_path
|
Path
|
Path to the active config file. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
UniformPersonaSampler |
UniformPersonaSampler
|
Initialized sampler with user/assistant pools. |
Side Effects / I/O: - Reads persona files when enabled.
Examples:
>>> from dlgforge.config.personas import build_uniform_persona_sampler
>>> build_uniform_persona_sampler(...)
load_personas(cfg, project_root, config_path)
¶
Load user and assistant personas from configuration.
Falls back to built-in defaults when the configured file is missing, unreadable, or malformed.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cfg
|
Dict[str, Any]
|
Loaded runtime configuration. |
required |
project_root
|
Path
|
Project root used for resolving relative paths. |
required |
config_path
|
Path
|
Path to the active config file. |
required |
Returns:
| Type | Description |
|---|---|
Dict[str, List[Dict[str, Any]]]
|
Dict[str, List[Dict[str, Any]]]: Mapping with |
Dict[str, List[Dict[str, Any]]]
|
persona lists. |
Side Effects / I/O: - Reads YAML from disk when a personas file is configured.
Examples:
>>> from dlgforge.config.personas import load_personas
>>> load_personas(...)
default_personas()
¶
Return the built-in fallback persona set.
Returns:
| Type | Description |
|---|---|
Dict[str, List[Dict[str, Any]]]
|
Dict[str, List[Dict[str, Any]]]: Mapping with one default user persona |
Dict[str, List[Dict[str, Any]]]
|
and one default assistant persona. |
Examples:
>>> from dlgforge.config.personas import default_personas
>>> sorted(default_personas().keys())
['assistant', 'user']
format_persona(persona)
¶
Format a persona record into a compact display string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
persona
|
Dict[str, Any]
|
Persona mapping with optional |
required |
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
Human-readable persona string. Returns an empty string for empty |
str
|
persona input. |
Examples:
>>> from dlgforge.config.personas import format_persona
>>> format_persona({'name': 'Tutor', 'traits': ['patient'], 'style': 'Explains step-by-step'})
'Tutor | patient | Explains step-by-step'