synkro 0.4.36__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synkro might be problematic. Click here for more details.

Files changed (81) hide show
  1. synkro/__init__.py +331 -0
  2. synkro/advanced.py +184 -0
  3. synkro/cli.py +156 -0
  4. synkro/core/__init__.py +7 -0
  5. synkro/core/checkpoint.py +250 -0
  6. synkro/core/dataset.py +432 -0
  7. synkro/core/policy.py +337 -0
  8. synkro/errors.py +178 -0
  9. synkro/examples/__init__.py +148 -0
  10. synkro/factory.py +291 -0
  11. synkro/formatters/__init__.py +18 -0
  12. synkro/formatters/chatml.py +121 -0
  13. synkro/formatters/langfuse.py +98 -0
  14. synkro/formatters/langsmith.py +98 -0
  15. synkro/formatters/qa.py +112 -0
  16. synkro/formatters/sft.py +90 -0
  17. synkro/formatters/tool_call.py +127 -0
  18. synkro/generation/__init__.py +9 -0
  19. synkro/generation/follow_ups.py +134 -0
  20. synkro/generation/generator.py +314 -0
  21. synkro/generation/golden_responses.py +269 -0
  22. synkro/generation/golden_scenarios.py +333 -0
  23. synkro/generation/golden_tool_responses.py +791 -0
  24. synkro/generation/logic_extractor.py +126 -0
  25. synkro/generation/multiturn_responses.py +177 -0
  26. synkro/generation/planner.py +131 -0
  27. synkro/generation/responses.py +189 -0
  28. synkro/generation/scenarios.py +90 -0
  29. synkro/generation/tool_responses.py +625 -0
  30. synkro/generation/tool_simulator.py +114 -0
  31. synkro/interactive/__init__.py +16 -0
  32. synkro/interactive/hitl_session.py +205 -0
  33. synkro/interactive/intent_classifier.py +94 -0
  34. synkro/interactive/logic_map_editor.py +176 -0
  35. synkro/interactive/rich_ui.py +459 -0
  36. synkro/interactive/scenario_editor.py +198 -0
  37. synkro/llm/__init__.py +7 -0
  38. synkro/llm/client.py +309 -0
  39. synkro/llm/rate_limits.py +99 -0
  40. synkro/models/__init__.py +50 -0
  41. synkro/models/anthropic.py +26 -0
  42. synkro/models/google.py +19 -0
  43. synkro/models/local.py +104 -0
  44. synkro/models/openai.py +31 -0
  45. synkro/modes/__init__.py +13 -0
  46. synkro/modes/config.py +66 -0
  47. synkro/modes/conversation.py +35 -0
  48. synkro/modes/tool_call.py +18 -0
  49. synkro/parsers.py +442 -0
  50. synkro/pipeline/__init__.py +20 -0
  51. synkro/pipeline/phases.py +592 -0
  52. synkro/pipeline/runner.py +769 -0
  53. synkro/pipelines.py +136 -0
  54. synkro/prompts/__init__.py +57 -0
  55. synkro/prompts/base.py +167 -0
  56. synkro/prompts/golden_templates.py +533 -0
  57. synkro/prompts/interactive_templates.py +198 -0
  58. synkro/prompts/multiturn_templates.py +156 -0
  59. synkro/prompts/templates.py +281 -0
  60. synkro/prompts/tool_templates.py +318 -0
  61. synkro/quality/__init__.py +14 -0
  62. synkro/quality/golden_refiner.py +163 -0
  63. synkro/quality/grader.py +153 -0
  64. synkro/quality/multiturn_grader.py +150 -0
  65. synkro/quality/refiner.py +137 -0
  66. synkro/quality/tool_grader.py +126 -0
  67. synkro/quality/tool_refiner.py +128 -0
  68. synkro/quality/verifier.py +228 -0
  69. synkro/reporting.py +464 -0
  70. synkro/schemas.py +521 -0
  71. synkro/types/__init__.py +43 -0
  72. synkro/types/core.py +153 -0
  73. synkro/types/dataset_type.py +33 -0
  74. synkro/types/logic_map.py +348 -0
  75. synkro/types/tool.py +94 -0
  76. synkro-0.4.36.data/data/examples/__init__.py +148 -0
  77. synkro-0.4.36.dist-info/METADATA +507 -0
  78. synkro-0.4.36.dist-info/RECORD +81 -0
  79. synkro-0.4.36.dist-info/WHEEL +4 -0
  80. synkro-0.4.36.dist-info/entry_points.txt +2 -0
  81. synkro-0.4.36.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,90 @@
1
+ """Scenario generation from policy documents."""
2
+
3
+ from synkro.llm.client import LLM
4
+ from synkro.models import Model, OpenAI
5
+ from synkro.types.core import Scenario, Category
6
+ from synkro.prompts.templates import SCENARIO_GENERATOR_PROMPT, CATEGORY_SCENARIO_PROMPT
7
+ from synkro.schemas import ScenariosArray
8
+
9
+
10
+ class ScenarioGenerator:
11
+ """
12
+ Generates realistic scenarios from policy documents.
13
+
14
+ Creates diverse scenarios that test different aspects of policy
15
+ understanding and compliance.
16
+
17
+ Examples:
18
+ >>> gen = ScenarioGenerator()
19
+ >>> scenarios = await gen.generate(policy.text, count=50)
20
+ >>> for s in scenarios:
21
+ ... print(s.description)
22
+ """
23
+
24
+ def __init__(self, llm: LLM | None = None, model: Model = OpenAI.GPT_4O_MINI):
25
+ """
26
+ Initialize the scenario generator.
27
+
28
+ Args:
29
+ llm: LLM client to use (creates one if not provided)
30
+ model: Model to use if creating LLM
31
+ """
32
+ self.llm = llm or LLM(model=model)
33
+ self.prompt_template = SCENARIO_GENERATOR_PROMPT
34
+
35
+ async def generate(
36
+ self,
37
+ policy_text: str,
38
+ count: int,
39
+ category: Category | None = None,
40
+ ) -> list[Scenario]:
41
+ """
42
+ Generate scenarios from the policy.
43
+
44
+ Args:
45
+ policy_text: The policy text
46
+ count: Number of scenarios to generate
47
+ category: Optional category to focus on
48
+
49
+ Returns:
50
+ List of generated scenarios
51
+ """
52
+ if category:
53
+ prompt = self._build_category_prompt(policy_text, count, category)
54
+ else:
55
+ prompt = self._build_general_prompt(policy_text, count)
56
+
57
+ # Use structured output for reliable scenario generation
58
+ parsed = await self.llm.generate_structured(prompt, ScenariosArray)
59
+ return [
60
+ Scenario(
61
+ description=s.scenario,
62
+ context=s.context,
63
+ category=category.name if category else None,
64
+ )
65
+ for s in parsed.scenarios[:count]
66
+ ]
67
+
68
+ def _build_general_prompt(self, policy_text: str, count: int) -> str:
69
+ """Build prompt for general scenario generation."""
70
+ return f"""{self.prompt_template}
71
+
72
+ POLICY:
73
+ {policy_text}
74
+
75
+ Generate exactly {count} diverse scenarios."""
76
+
77
+ def _build_category_prompt(
78
+ self, policy_text: str, count: int, category: Category
79
+ ) -> str:
80
+ """Build prompt for category-specific scenario generation."""
81
+ return f"""{CATEGORY_SCENARIO_PROMPT}
82
+
83
+ Category: {category.name}
84
+ Description: {category.description}
85
+
86
+ POLICY:
87
+ {policy_text}
88
+
89
+ Generate exactly {count} scenarios for the "{category.name}" category."""
90
+