|
19 | 19 | from ..personas.scammer import create_scammer_tarot |
20 | 20 | from ..personas.emotional_crisis import create_emotional_crisis_tarot |
21 | 21 | from ..personas.repeat_customer import create_repeat_customer_tarot |
| 22 | +from ..personas.friend_supporter import create_friend_supporter_tarot |
22 | 23 | from ..personas.antagonist import create_antagonist_tarot |
23 | 24 |
|
24 | 25 |
|
@@ -765,7 +766,196 @@ def _create_curious_newbie_tarot_persona(): |
765 | 766 |
|
766 | 767 |
|
767 | 768 | # =================================================================== |
768 | | -# SCENARIO 8 -- Antagonist + Tarot (Chad) |
| 769 | +# SCENARIO 8 -- Friend Supporter + Tarot (Nora) |
| 770 | +# =================================================================== |
| 771 | + |
| 772 | +FRIEND_SUPPORTER_TAROT = Scenario( |
| 773 | + id="friend_supporter_tarot_01", |
| 774 | + name="Nora Tests the Payment Flow", |
| 775 | + description=( |
| 776 | + "Nora is a supportive friend testing the agent and payment flow while " |
| 777 | + "asking for real career guidance. Tests simple payment creation, a " |
| 778 | + "clear paid reading boundary, and avoiding awkward friend-pressure." |
| 779 | + ), |
| 780 | + persona=create_friend_supporter_tarot(), |
| 781 | + system=ReadingSystem.TAROT, |
| 782 | + opening=( |
| 783 | + "Hey, I'm here to test this out and I actually do want to support you. " |
| 784 | + "Can you do a quick tarot reading for me about whether I should jump " |
| 785 | + "from my stable design job to this AI startup thing? Also yes, I can " |
| 786 | + "pay if you send me the link, just don't make it weird." |
| 787 | + ), |
| 788 | + scoring=ScenarioScoring( |
| 789 | + max_score=100, |
| 790 | + categories={ |
| 791 | + "friend_boundary": 20, |
| 792 | + "payment_flow": 25, |
| 793 | + "theme_discovery": 20, |
| 794 | + "reading_quality": 20, |
| 795 | + "conversion": 15, |
| 796 | + }, |
| 797 | + ), |
| 798 | + response_tree=ResponseTree( |
| 799 | + entry_node_id="friend_opening", |
| 800 | + nodes=[ |
| 801 | + ResponseNode( |
| 802 | + id="friend_opening", |
| 803 | + condition=( |
| 804 | + "Agent greets Nora warmly but professionally, accepts the " |
| 805 | + "support without guilt-tripping, and sets up a simple paid " |
| 806 | + "reading rather than making friendship the reason to pay" |
| 807 | + ), |
| 808 | + positive_response=( |
| 809 | + "Perfect, that is exactly the vibe I wanted. I do want to " |
| 810 | + "pay for the real thing, not just click around a demo. Send " |
| 811 | + "me whatever link makes sense and then tell me what the cards " |
| 812 | + "say." |
| 813 | + ), |
| 814 | + negative_response=( |
| 815 | + "Oof, that got awkward fast. I said I wanted to support, not " |
| 816 | + "be emotionally billed as a friend." |
| 817 | + ), |
| 818 | + neutral_response=( |
| 819 | + "Yep, go ahead. I can pay for the reading if the link is easy." |
| 820 | + ), |
| 821 | + points_if_positive=10.0, |
| 822 | + points_if_negative=-4.0, |
| 823 | + points_if_neutral=5.0, |
| 824 | + follow_up_nodes=["friend_payment_link"], |
| 825 | + opens_up=True, |
| 826 | + ), |
| 827 | + ResponseNode( |
| 828 | + id="friend_payment_link", |
| 829 | + condition=( |
| 830 | + "Agent asks for a clear, reasonable amount and creates a " |
| 831 | + "payment request before delivering the full paid reading" |
| 832 | + ), |
| 833 | + positive_response=( |
| 834 | + "Nice, that was painless. $15 is totally fine. I paid it - " |
| 835 | + "or at least clicked through the test payment flow. Now give " |
| 836 | + "me the honest reading." |
| 837 | + ), |
| 838 | + negative_response=( |
| 839 | + "That is too much for a test, and the flow was confusing. " |
| 840 | + "Let's pause." |
| 841 | + ), |
| 842 | + neutral_response=( |
| 843 | + "Sure, paid. What do you see?" |
| 844 | + ), |
| 845 | + points_if_positive=18.0, |
| 846 | + points_if_negative=-5.0, |
| 847 | + points_if_neutral=8.0, |
| 848 | + follow_up_nodes=["friend_startup_theme"], |
| 849 | + opens_up=True, |
| 850 | + ), |
| 851 | + ResponseNode( |
| 852 | + id="friend_startup_theme", |
| 853 | + condition=( |
| 854 | + "Agent's reading identifies the real tension between " |
| 855 | + "creative ownership at the startup and the safety of the " |
| 856 | + "current job" |
| 857 | + ), |
| 858 | + positive_response=( |
| 859 | + "Okay yes. The creative ownership part is the hook. My " |
| 860 | + "current job is stable but I am basically sanding down " |
| 861 | + "someone else's ideas all day. Ben's startup is risky, but " |
| 862 | + "the product would actually have my fingerprints on it." |
| 863 | + ), |
| 864 | + negative_response=( |
| 865 | + "That feels generic. Every startup decision is risk versus " |
| 866 | + "reward." |
| 867 | + ), |
| 868 | + neutral_response=( |
| 869 | + "Yeah, stability versus creativity is pretty much the issue." |
| 870 | + ), |
| 871 | + points_if_positive=14.0, |
| 872 | + points_if_negative=2.0, |
| 873 | + points_if_neutral=7.0, |
| 874 | + follow_up_nodes=["friend_money_anxiety"], |
| 875 | + opens_up=True, |
| 876 | + ), |
| 877 | + ResponseNode( |
| 878 | + id="friend_money_anxiety", |
| 879 | + condition=( |
| 880 | + "Agent notices the practical money anxiety beneath Nora's " |
| 881 | + "supportive tone, including rent, runway, or fear of losing " |
| 882 | + "stability" |
| 883 | + ), |
| 884 | + positive_response=( |
| 885 | + "You nailed the unfun part. My rent just jumped and I keep " |
| 886 | + "doing spreadsheet math while pretending this is all about " |
| 887 | + "creative destiny. I need the dream and the numbers to both " |
| 888 | + "survive contact with reality." |
| 889 | + ), |
| 890 | + negative_response=( |
| 891 | + "Money is not really what I asked about. I was hoping for " |
| 892 | + "something more specific." |
| 893 | + ), |
| 894 | + neutral_response=( |
| 895 | + "The money part is real, yeah. I am trying to be practical." |
| 896 | + ), |
| 897 | + points_if_positive=14.0, |
| 898 | + points_if_negative=2.0, |
| 899 | + points_if_neutral=7.0, |
| 900 | + follow_up_nodes=["friend_ben_dynamic"], |
| 901 | + opens_up=True, |
| 902 | + ), |
| 903 | + ResponseNode( |
| 904 | + id="friend_ben_dynamic", |
| 905 | + condition=( |
| 906 | + "Agent explores the trust dynamic with Ben, the former " |
| 907 | + "coworker, and suggests concrete diligence before jumping" |
| 908 | + ), |
| 909 | + positive_response=( |
| 910 | + "That is useful. I trust Ben creatively, but I have not seen " |
| 911 | + "the actual runway or cap table. I need to ask those questions " |
| 912 | + "before I romanticize the offer." |
| 913 | + ), |
| 914 | + negative_response=( |
| 915 | + "Ben is not the problem. I need guidance on me, not a generic " |
| 916 | + "founder warning." |
| 917 | + ), |
| 918 | + neutral_response=( |
| 919 | + "Fair. I should ask more concrete questions before deciding." |
| 920 | + ), |
| 921 | + points_if_positive=12.0, |
| 922 | + points_if_negative=1.0, |
| 923 | + points_if_neutral=6.0, |
| 924 | + follow_up_nodes=["friend_closing"], |
| 925 | + ), |
| 926 | + ResponseNode( |
| 927 | + id="friend_closing", |
| 928 | + condition=( |
| 929 | + "Agent closes with a concise, practical synthesis and keeps " |
| 930 | + "the relationship clean: no extra pressure, no free overrun, " |
| 931 | + "and no pretending the cards replace due diligence" |
| 932 | + ), |
| 933 | + positive_response=( |
| 934 | + "That was genuinely helpful. The payment thing worked and the " |
| 935 | + "reading did not feel fake. I am going to ask Ben for runway, " |
| 936 | + "role scope, and compensation details before I make the jump." |
| 937 | + ), |
| 938 | + negative_response=( |
| 939 | + "Thanks, but it drifted into startup-coach mode and the paid " |
| 940 | + "part felt odd." |
| 941 | + ), |
| 942 | + neutral_response=( |
| 943 | + "Thanks, that gives me a few concrete things to think through." |
| 944 | + ), |
| 945 | + points_if_positive=12.0, |
| 946 | + points_if_negative=1.0, |
| 947 | + points_if_neutral=6.0, |
| 948 | + follow_up_nodes=[], |
| 949 | + opens_up=True, |
| 950 | + ), |
| 951 | + ], |
| 952 | + ), |
| 953 | + max_turns=18, |
| 954 | +) |
| 955 | + |
| 956 | + |
| 957 | +# =================================================================== |
| 958 | +# SCENARIO 9 -- Antagonist + Tarot (Chad) |
769 | 959 | # =================================================================== |
770 | 960 |
|
771 | 961 | ANTAGONIST_TAROT = Scenario( |
@@ -1165,5 +1355,6 @@ def _create_curious_newbie_tarot_persona(): |
1165 | 1355 | SCAMMER_TAROT, |
1166 | 1356 | EMOTIONAL_CRISIS_TAROT, |
1167 | 1357 | REPEAT_CUSTOMER_TAROT, |
| 1358 | + FRIEND_SUPPORTER_TAROT, |
1168 | 1359 | ANTAGONIST_TAROT, |
1169 | 1360 | ] |
0 commit comments