Jac-Zac commited on
Commit ·
88f2164
1
Parent(s): 610d258
Updated to lates versions
Browse files- pyproject.toml +2 -2
- tabs/extract.py +16 -45
- utils/chat.py +6 -69
- utils/contrast.py +4 -2
- uv.lock +17 -17
pyproject.toml
CHANGED
|
@@ -5,8 +5,8 @@ description = "Streamlit UI for persona-vectors"
|
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
-
"persona-vectors>=0.4.
|
| 9 |
-
"persona-data>=0.2.
|
| 10 |
"streamlit>=1.44.0",
|
| 11 |
"plotly>=6.6.0",
|
| 12 |
"python-dotenv>=1.2.2",
|
|
|
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
+
"persona-vectors>=0.4.3",
|
| 9 |
+
"persona-data>=0.2.7",
|
| 10 |
"streamlit>=1.44.0",
|
| 11 |
"plotly>=6.6.0",
|
| 12 |
"python-dotenv>=1.2.2",
|
tabs/extract.py
CHANGED
|
@@ -5,14 +5,15 @@ import streamlit as st
|
|
| 5 |
from persona_data.prompts import (
|
| 6 |
BASELINE_PERSONA_ID,
|
| 7 |
BASELINE_PERSONA_NAME,
|
| 8 |
-
|
| 9 |
)
|
| 10 |
from persona_data.synth_persona import PersonaData, QAPair
|
| 11 |
from persona_vectors.artifacts import PERSONA_VARIANTS
|
| 12 |
from persona_vectors.extraction import (
|
| 13 |
MaskStrategy,
|
| 14 |
-
|
| 15 |
prepare_inputs_for_strategy,
|
|
|
|
| 16 |
run_extraction,
|
| 17 |
)
|
| 18 |
|
|
@@ -77,54 +78,24 @@ _TOKEN_LEGEND = (
|
|
| 77 |
_MAX_PREVIEW_SAMPLES = 3
|
| 78 |
|
| 79 |
|
| 80 |
-
def
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
else:
|
| 88 |
-
style = "color:#9ca3af"
|
| 89 |
-
|
| 90 |
-
if int(p.input_ids[token_idx]) in special_ids:
|
| 91 |
style = "color:#d946ef;font-weight:bold"
|
| 92 |
-
if
|
| 93 |
style = f"{style};background:#86efac;border-radius:2px;padding:0 1px"
|
| 94 |
return style
|
| 95 |
|
| 96 |
|
| 97 |
-
def _render_sample_tokens_html(
|
| 98 |
-
p: PreparedInput, tokenizer, *, max_tokens: int = 200
|
| 99 |
-
) -> str:
|
| 100 |
-
"""Build an HTML token sequence using the persona-vectors preview layout."""
|
| 101 |
-
special_ids = set(tokenizer.all_special_ids)
|
| 102 |
-
seq_len = int(p.input_ids.shape[0])
|
| 103 |
-
edge = max(8, max_tokens // 4)
|
| 104 |
-
|
| 105 |
-
prefix_end = min(p.spans.template.token_start + max_tokens, seq_len)
|
| 106 |
-
tail_start = min(max(prefix_end, p.spans.template.token_end - edge), seq_len)
|
| 107 |
-
answer_end = min(seq_len, p.spans.response.token_end + edge)
|
| 108 |
-
|
| 109 |
-
indices: list[int | None] = list(range(0, prefix_end))
|
| 110 |
-
if prefix_end < tail_start:
|
| 111 |
-
indices.append(None)
|
| 112 |
-
indices.extend(range(tail_start, answer_end))
|
| 113 |
-
if answer_end < seq_len:
|
| 114 |
-
indices.append(None)
|
| 115 |
-
|
| 116 |
spans: list[str] = []
|
| 117 |
-
for
|
| 118 |
-
if idx is None:
|
| 119 |
-
spans.append('<span style="color:#9ca3af"> … </span>')
|
| 120 |
-
continue
|
| 121 |
-
char_start, char_end = p.offset_mapping[idx]
|
| 122 |
-
raw = p.prompt_text[char_start:char_end]
|
| 123 |
-
if not raw:
|
| 124 |
-
raw = tokenizer.convert_ids_to_tokens([int(p.input_ids[idx])])[0]
|
| 125 |
-
escaped = html.escape(raw)
|
| 126 |
spans.append(
|
| 127 |
-
f'<span style="{
|
| 128 |
)
|
| 129 |
|
| 130 |
return (
|
|
@@ -357,9 +328,9 @@ def render_extract_tab(remote: bool, model_name: str, dataset_source: str) -> No
|
|
| 357 |
st.markdown(_TOKEN_LEGEND, unsafe_allow_html=True)
|
| 358 |
for persona, qa_pairs, variant in run_plan:
|
| 359 |
system_prompt = (
|
| 360 |
-
|
| 361 |
if persona is None
|
| 362 |
-
else
|
| 363 |
)
|
| 364 |
prepared = prepare_inputs_for_strategy(
|
| 365 |
tokenizer=model.tokenizer,
|
|
|
|
| 5 |
from persona_data.prompts import (
|
| 6 |
BASELINE_PERSONA_ID,
|
| 7 |
BASELINE_PERSONA_NAME,
|
| 8 |
+
format_prompt,
|
| 9 |
)
|
| 10 |
from persona_data.synth_persona import PersonaData, QAPair
|
| 11 |
from persona_vectors.artifacts import PERSONA_VARIANTS
|
| 12 |
from persona_vectors.extraction import (
|
| 13 |
MaskStrategy,
|
| 14 |
+
TokenSegment,
|
| 15 |
prepare_inputs_for_strategy,
|
| 16 |
+
preview_token_segments,
|
| 17 |
run_extraction,
|
| 18 |
)
|
| 19 |
|
|
|
|
| 78 |
_MAX_PREVIEW_SAMPLES = 3
|
| 79 |
|
| 80 |
|
| 81 |
+
def _token_style(segment: TokenSegment) -> str:
|
| 82 |
+
style = {
|
| 83 |
+
"response": "color:#22d3ee",
|
| 84 |
+
"question": "color:#fde047",
|
| 85 |
+
}.get(segment.role, "color:#9ca3af")
|
| 86 |
+
|
| 87 |
+
if segment.is_special:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
style = "color:#d946ef;font-weight:bold"
|
| 89 |
+
if segment.is_masked:
|
| 90 |
style = f"{style};background:#86efac;border-radius:2px;padding:0 1px"
|
| 91 |
return style
|
| 92 |
|
| 93 |
|
| 94 |
+
def _render_sample_tokens_html(p, tokenizer, *, max_tokens: int = 200) -> str:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
spans: list[str] = []
|
| 96 |
+
for segment in preview_token_segments(p, tokenizer, max_tokens=max_tokens):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
spans.append(
|
| 98 |
+
f'<span style="{_token_style(segment)}">{html.escape(segment.text)}</span>'
|
| 99 |
)
|
| 100 |
|
| 101 |
return (
|
|
|
|
| 328 |
st.markdown(_TOKEN_LEGEND, unsafe_allow_html=True)
|
| 329 |
for persona, qa_pairs, variant in run_plan:
|
| 330 |
system_prompt = (
|
| 331 |
+
format_prompt()
|
| 332 |
if persona is None
|
| 333 |
+
else format_prompt(persona, variant) # type: ignore[arg-type]
|
| 334 |
)
|
| 335 |
prepared = prepare_inputs_for_strategy(
|
| 336 |
tokenizer=model.tokenizer,
|
utils/chat.py
CHANGED
|
@@ -1,14 +1,12 @@
|
|
| 1 |
-
import logging
|
| 2 |
from contextlib import contextmanager, nullcontext
|
| 3 |
from dataclasses import dataclass
|
| 4 |
from typing import Literal
|
| 5 |
|
| 6 |
import torch
|
| 7 |
from nnterp import StandardizedTransformer
|
| 8 |
-
from persona_data.prompts import
|
| 9 |
from persona_data.synth_persona import PersonaData
|
| 10 |
|
| 11 |
-
logger = logging.getLogger(__name__)
|
| 12 |
SystemPromptMode = Literal["empty", "templated", "biography", "custom"]
|
| 13 |
|
| 14 |
|
|
@@ -36,75 +34,12 @@ def resolve_system_prompt(
|
|
| 36 |
if persona is None or mode == "empty":
|
| 37 |
return ""
|
| 38 |
if mode == "custom":
|
| 39 |
-
return
|
| 40 |
if mode in ("templated", "biography"):
|
| 41 |
-
return
|
| 42 |
-
getattr(persona, f"{mode}_view"), mode="conversational"
|
| 43 |
-
)
|
| 44 |
raise ValueError(f"Unsupported system prompt mode: {mode}")
|
| 45 |
|
| 46 |
|
| 47 |
-
def _format_plain_messages(messages: list[dict[str, str]]) -> str:
|
| 48 |
-
"""Format messages as plain ``Role: content`` text, used as a last-resort fallback."""
|
| 49 |
-
lines: list[str] = []
|
| 50 |
-
|
| 51 |
-
for message in messages:
|
| 52 |
-
role = message["role"]
|
| 53 |
-
content = message["content"]
|
| 54 |
-
|
| 55 |
-
if role == "system":
|
| 56 |
-
if content:
|
| 57 |
-
lines.append(f"System: {content}")
|
| 58 |
-
elif role == "user":
|
| 59 |
-
lines.append(f"User: {content}")
|
| 60 |
-
elif role == "assistant":
|
| 61 |
-
lines.append(f"Assistant: {content}")
|
| 62 |
-
else:
|
| 63 |
-
lines.append(f"{role.title()}: {content}")
|
| 64 |
-
|
| 65 |
-
if not lines or not lines[-1].startswith("Assistant:"):
|
| 66 |
-
lines.append("Assistant:")
|
| 67 |
-
|
| 68 |
-
return "\n\n".join(lines)
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
def format_generation_prompt(
|
| 72 |
-
messages: list[dict[str, str]], tokenizer: object
|
| 73 |
-
) -> tuple[str, int]:
|
| 74 |
-
"""Render messages into a single prompt string and count prompt tokens.
|
| 75 |
-
|
| 76 |
-
Tries the tokenizer's chat template first, falls back to normalized messages,
|
| 77 |
-
then to a plain-text format if both template attempts fail.
|
| 78 |
-
"""
|
| 79 |
-
try:
|
| 80 |
-
prompt = tokenizer.apply_chat_template(
|
| 81 |
-
messages,
|
| 82 |
-
tokenize=False,
|
| 83 |
-
add_generation_prompt=True,
|
| 84 |
-
)
|
| 85 |
-
except Exception:
|
| 86 |
-
logger.debug(
|
| 87 |
-
"Chat template failed on raw messages, trying normalized", exc_info=True
|
| 88 |
-
)
|
| 89 |
-
messages = _normalize_messages(messages)
|
| 90 |
-
|
| 91 |
-
try:
|
| 92 |
-
prompt = tokenizer.apply_chat_template(
|
| 93 |
-
messages,
|
| 94 |
-
tokenize=False,
|
| 95 |
-
add_generation_prompt=True,
|
| 96 |
-
)
|
| 97 |
-
except Exception:
|
| 98 |
-
logger.debug(
|
| 99 |
-
"Chat template failed on normalized messages, falling back to plain format",
|
| 100 |
-
exc_info=True,
|
| 101 |
-
)
|
| 102 |
-
prompt = _format_plain_messages(messages)
|
| 103 |
-
|
| 104 |
-
prompt_token_count = tokenizer(prompt, return_tensors="pt").input_ids.shape[1]
|
| 105 |
-
return prompt, prompt_token_count
|
| 106 |
-
|
| 107 |
-
|
| 108 |
@contextmanager
|
| 109 |
def _seeded_rng(seed: int | None):
|
| 110 |
"""Context manager that forks the RNG state and sets a deterministic seed."""
|
|
@@ -161,7 +96,9 @@ def generate_chat_reply(
|
|
| 161 |
"""
|
| 162 |
|
| 163 |
tokenizer = model.tokenizer
|
| 164 |
-
prompt, prompt_token_count =
|
|
|
|
|
|
|
| 165 |
|
| 166 |
generation_kwargs: dict[str, object] = {
|
| 167 |
"max_new_tokens": max_new_tokens,
|
|
|
|
|
|
|
| 1 |
from contextlib import contextmanager, nullcontext
|
| 2 |
from dataclasses import dataclass
|
| 3 |
from typing import Literal
|
| 4 |
|
| 5 |
import torch
|
| 6 |
from nnterp import StandardizedTransformer
|
| 7 |
+
from persona_data.prompts import format_messages, format_prompt
|
| 8 |
from persona_data.synth_persona import PersonaData
|
| 9 |
|
|
|
|
| 10 |
SystemPromptMode = Literal["empty", "templated", "biography", "custom"]
|
| 11 |
|
| 12 |
|
|
|
|
| 34 |
if persona is None or mode == "empty":
|
| 35 |
return ""
|
| 36 |
if mode == "custom":
|
| 37 |
+
return format_prompt(mode="conversational")
|
| 38 |
if mode in ("templated", "biography"):
|
| 39 |
+
return format_prompt(persona, mode, mode="conversational")
|
|
|
|
|
|
|
| 40 |
raise ValueError(f"Unsupported system prompt mode: {mode}")
|
| 41 |
|
| 42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
@contextmanager
|
| 44 |
def _seeded_rng(seed: int | None):
|
| 45 |
"""Context manager that forks the RNG state and sets a deterministic seed."""
|
|
|
|
| 96 |
"""
|
| 97 |
|
| 98 |
tokenizer = model.tokenizer
|
| 99 |
+
prompt, prompt_token_count = format_messages(
|
| 100 |
+
messages, tokenizer, add_generation_prompt=True
|
| 101 |
+
)
|
| 102 |
|
| 103 |
generation_kwargs: dict[str, object] = {
|
| 104 |
"max_new_tokens": max_new_tokens,
|
utils/contrast.py
CHANGED
|
@@ -18,7 +18,7 @@ from html import escape
|
|
| 18 |
import torch
|
| 19 |
from nnterp import StandardizedTransformer
|
| 20 |
|
| 21 |
-
from
|
| 22 |
|
| 23 |
logger = logging.getLogger(__name__)
|
| 24 |
|
|
@@ -79,7 +79,9 @@ def _prepare_trace_text(
|
|
| 79 |
response_ids: torch.Tensor,
|
| 80 |
) -> tuple[str, int, int]:
|
| 81 |
"""Build the trace text and return ``(full_text, n_ctx, n_resp)``."""
|
| 82 |
-
context_prompt, _ =
|
|
|
|
|
|
|
| 83 |
context_ids = tokenizer(context_prompt, return_tensors="pt").input_ids[0]
|
| 84 |
response_text = _decode_ids(tokenizer, response_ids.tolist())
|
| 85 |
full_text = context_prompt + response_text
|
|
|
|
| 18 |
import torch
|
| 19 |
from nnterp import StandardizedTransformer
|
| 20 |
|
| 21 |
+
from persona_data.prompts import format_messages
|
| 22 |
|
| 23 |
logger = logging.getLogger(__name__)
|
| 24 |
|
|
|
|
| 79 |
response_ids: torch.Tensor,
|
| 80 |
) -> tuple[str, int, int]:
|
| 81 |
"""Build the trace text and return ``(full_text, n_ctx, n_resp)``."""
|
| 82 |
+
context_prompt, _ = format_messages(
|
| 83 |
+
context_messages, tokenizer, add_generation_prompt=True
|
| 84 |
+
)
|
| 85 |
context_ids = tokenizer(context_prompt, return_tensors="pt").input_ids[0]
|
| 86 |
response_text = _decode_ids(tokenizer, response_ids.tolist())
|
| 87 |
full_text = context_prompt + response_text
|
uv.lock
CHANGED
|
@@ -353,11 +353,11 @@ wheels = [
|
|
| 353 |
|
| 354 |
[[package]]
|
| 355 |
name = "fsspec"
|
| 356 |
-
version = "2026.
|
| 357 |
source = { registry = "https://pypi.org/simple" }
|
| 358 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 359 |
wheels = [
|
| 360 |
-
{ url = "https://files.pythonhosted.org/packages/d5/
|
| 361 |
]
|
| 362 |
|
| 363 |
[[package]]
|
|
@@ -484,7 +484,7 @@ wheels = [
|
|
| 484 |
|
| 485 |
[[package]]
|
| 486 |
name = "huggingface-hub"
|
| 487 |
-
version = "1.
|
| 488 |
source = { registry = "https://pypi.org/simple" }
|
| 489 |
dependencies = [
|
| 490 |
{ name = "filelock" },
|
|
@@ -497,9 +497,9 @@ dependencies = [
|
|
| 497 |
{ name = "typer" },
|
| 498 |
{ name = "typing-extensions" },
|
| 499 |
]
|
| 500 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 501 |
wheels = [
|
| 502 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 503 |
]
|
| 504 |
|
| 505 |
[[package]]
|
|
@@ -1209,7 +1209,7 @@ wheels = [
|
|
| 1209 |
|
| 1210 |
[[package]]
|
| 1211 |
name = "persona-data"
|
| 1212 |
-
version = "0.2.
|
| 1213 |
source = { registry = "https://pypi.org/simple" }
|
| 1214 |
dependencies = [
|
| 1215 |
{ name = "huggingface-hub" },
|
|
@@ -1218,9 +1218,9 @@ dependencies = [
|
|
| 1218 |
{ name = "python-dotenv" },
|
| 1219 |
{ name = "torch" },
|
| 1220 |
]
|
| 1221 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 1222 |
wheels = [
|
| 1223 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 1224 |
]
|
| 1225 |
|
| 1226 |
[[package]]
|
|
@@ -1238,8 +1238,8 @@ dependencies = [
|
|
| 1238 |
|
| 1239 |
[package.metadata]
|
| 1240 |
requires-dist = [
|
| 1241 |
-
{ name = "persona-data", specifier = ">=0.2.
|
| 1242 |
-
{ name = "persona-vectors", specifier = ">=0.4.
|
| 1243 |
{ name = "plotly", specifier = ">=6.6.0" },
|
| 1244 |
{ name = "python-dotenv", specifier = ">=1.2.2" },
|
| 1245 |
{ name = "streamlit", specifier = ">=1.44.0" },
|
|
@@ -1248,7 +1248,7 @@ requires-dist = [
|
|
| 1248 |
|
| 1249 |
[[package]]
|
| 1250 |
name = "persona-vectors"
|
| 1251 |
-
version = "0.4.
|
| 1252 |
source = { registry = "https://pypi.org/simple" }
|
| 1253 |
dependencies = [
|
| 1254 |
{ name = "kaleido" },
|
|
@@ -1265,9 +1265,9 @@ dependencies = [
|
|
| 1265 |
{ name = "transformers" },
|
| 1266 |
{ name = "umap-learn" },
|
| 1267 |
]
|
| 1268 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 1269 |
wheels = [
|
| 1270 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 1271 |
]
|
| 1272 |
|
| 1273 |
[[package]]
|
|
@@ -2462,7 +2462,7 @@ wheels = [
|
|
| 2462 |
|
| 2463 |
[[package]]
|
| 2464 |
name = "typer"
|
| 2465 |
-
version = "0.25.
|
| 2466 |
source = { registry = "https://pypi.org/simple" }
|
| 2467 |
dependencies = [
|
| 2468 |
{ name = "annotated-doc" },
|
|
@@ -2470,9 +2470,9 @@ dependencies = [
|
|
| 2470 |
{ name = "rich" },
|
| 2471 |
{ name = "shellingham" },
|
| 2472 |
]
|
| 2473 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2474 |
wheels = [
|
| 2475 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2476 |
]
|
| 2477 |
|
| 2478 |
[[package]]
|
|
|
|
| 353 |
|
| 354 |
[[package]]
|
| 355 |
name = "fsspec"
|
| 356 |
+
version = "2026.4.0"
|
| 357 |
source = { registry = "https://pypi.org/simple" }
|
| 358 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", hash = "sha256:301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4", size = 312760, upload-time = "2026-04-29T20:42:38.635Z" }
|
| 359 |
wheels = [
|
| 360 |
+
{ url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" },
|
| 361 |
]
|
| 362 |
|
| 363 |
[[package]]
|
|
|
|
| 484 |
|
| 485 |
[[package]]
|
| 486 |
name = "huggingface-hub"
|
| 487 |
+
version = "1.13.0"
|
| 488 |
source = { registry = "https://pypi.org/simple" }
|
| 489 |
dependencies = [
|
| 490 |
{ name = "filelock" },
|
|
|
|
| 497 |
{ name = "typer" },
|
| 498 |
{ name = "typing-extensions" },
|
| 499 |
]
|
| 500 |
+
sdist = { url = "https://files.pythonhosted.org/packages/89/ff/ec7ed2eb43bd7ce8bb2233d109cc235c3e807ffe5e469dc09db261fac05e/huggingface_hub-1.13.0.tar.gz", hash = "sha256:f6df2dac5abe82ce2fe05873d10d5ff47bc677d616a2f521f4ee26db9415d9d0", size = 781788, upload-time = "2026-04-30T11:57:33.858Z" }
|
| 501 |
wheels = [
|
| 502 |
+
{ url = "https://files.pythonhosted.org/packages/93/db/4b1cdae9460ae1f3ca020cd767f013430ce23eb1d9c890ae3a0609b38d26/huggingface_hub-1.13.0-py3-none-any.whl", hash = "sha256:e942cb50d6a08dd5306688b1ac05bda157fd2fcc88b63dae405f7bd0d3234005", size = 660643, upload-time = "2026-04-30T11:57:31.802Z" },
|
| 503 |
]
|
| 504 |
|
| 505 |
[[package]]
|
|
|
|
| 1209 |
|
| 1210 |
[[package]]
|
| 1211 |
name = "persona-data"
|
| 1212 |
+
version = "0.2.7"
|
| 1213 |
source = { registry = "https://pypi.org/simple" }
|
| 1214 |
dependencies = [
|
| 1215 |
{ name = "huggingface-hub" },
|
|
|
|
| 1218 |
{ name = "python-dotenv" },
|
| 1219 |
{ name = "torch" },
|
| 1220 |
]
|
| 1221 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e9/c1/8612da5d216e484f823333fcf6bc1ff97c266c800b597d70f9a19475b78e/persona_data-0.2.7.tar.gz", hash = "sha256:6cd95f82d628a2add68df3935ae47c36a13ab17bafaf495892be5b1192f4693e", size = 9143, upload-time = "2026-05-01T08:54:26.603Z" }
|
| 1222 |
wheels = [
|
| 1223 |
+
{ url = "https://files.pythonhosted.org/packages/b0/ad/65fff568431ae5620f15d5b9c1dff9a941fc77f8c6ebb6f3131c9010d713/persona_data-0.2.7-py3-none-any.whl", hash = "sha256:4395f46381d54e7047bd26a4eaa2e9db1bd29f80e00a813b8be3ede0192aafcb", size = 11832, upload-time = "2026-05-01T08:54:25.778Z" },
|
| 1224 |
]
|
| 1225 |
|
| 1226 |
[[package]]
|
|
|
|
| 1238 |
|
| 1239 |
[package.metadata]
|
| 1240 |
requires-dist = [
|
| 1241 |
+
{ name = "persona-data", specifier = ">=0.2.7" },
|
| 1242 |
+
{ name = "persona-vectors", specifier = ">=0.4.3" },
|
| 1243 |
{ name = "plotly", specifier = ">=6.6.0" },
|
| 1244 |
{ name = "python-dotenv", specifier = ">=1.2.2" },
|
| 1245 |
{ name = "streamlit", specifier = ">=1.44.0" },
|
|
|
|
| 1248 |
|
| 1249 |
[[package]]
|
| 1250 |
name = "persona-vectors"
|
| 1251 |
+
version = "0.4.3"
|
| 1252 |
source = { registry = "https://pypi.org/simple" }
|
| 1253 |
dependencies = [
|
| 1254 |
{ name = "kaleido" },
|
|
|
|
| 1265 |
{ name = "transformers" },
|
| 1266 |
{ name = "umap-learn" },
|
| 1267 |
]
|
| 1268 |
+
sdist = { url = "https://files.pythonhosted.org/packages/15/97/5f89f74a98faec09696108a1b2222a5d0bc99c129e035939ba8a70a61314/persona_vectors-0.4.3.tar.gz", hash = "sha256:3b86bed93373868506f1f6006f65e849d560bd20fb771310a33a674f02a90b0b", size = 21614, upload-time = "2026-05-01T16:49:11.757Z" }
|
| 1269 |
wheels = [
|
| 1270 |
+
{ url = "https://files.pythonhosted.org/packages/92/de/a666ee51901db501556e9f7014e7f61741df8f2b219ff676179b80e94cd4/persona_vectors-0.4.3-py3-none-any.whl", hash = "sha256:50bfb2de68613ec89a87f5773f4d2f5fe9981e2949f82e4823cd4f4ca093bee3", size = 25563, upload-time = "2026-05-01T16:49:12.694Z" },
|
| 1271 |
]
|
| 1272 |
|
| 1273 |
[[package]]
|
|
|
|
| 2462 |
|
| 2463 |
[[package]]
|
| 2464 |
name = "typer"
|
| 2465 |
+
version = "0.25.1"
|
| 2466 |
source = { registry = "https://pypi.org/simple" }
|
| 2467 |
dependencies = [
|
| 2468 |
{ name = "annotated-doc" },
|
|
|
|
| 2470 |
{ name = "rich" },
|
| 2471 |
{ name = "shellingham" },
|
| 2472 |
]
|
| 2473 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" }
|
| 2474 |
wheels = [
|
| 2475 |
+
{ url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" },
|
| 2476 |
]
|
| 2477 |
|
| 2478 |
[[package]]
|