openenv-support / data /knowledge_base.py
Mahir
Initial OpenEnv customer support environment
f5d79b8
Raw
History Blame Contribute Delete
3.93 kB
"""Knowledge base articles for agent context."""
from app.models import KnowledgeBaseArticle, TicketCategory
KNOWLEDGE_BASE = [
KnowledgeBaseArticle(
article_id="KB-001",
title="How to Request a Refund",
content=(
"Refunds are processed within 5-7 business days to the original payment method. "
"Eligible: duplicate charges (full refund), unused annual plan (prorated), outages > 99.5% SLA (credit). "
"Process: verify in Stripe, create refund in Admin > Billing > Customer > Refund. "
"Always send confirmation email with amount and timeline."
),
applicable_categories=[TicketCategory.BILLING],
relevance_score=0.95,
),
KnowledgeBaseArticle(
article_id="KB-002",
title="SSO / SAML Configuration Guide",
content=(
"Update SSO: Admin Panel > Security > SSO Configuration. "
"Entity ID and ACS URL must exactly match IdP config. "
"Domain migration: update Entity ID, re-download metadata XML, upload to IdP, test first. "
"Error 'Invalid SAML assertion': Entity ID mismatch or clock skew > 5 min."
),
applicable_categories=[TicketCategory.TECHNICAL, TicketCategory.ACCOUNT],
relevance_score=0.9,
),
KnowledgeBaseArticle(
article_id="KB-003",
title="Account Ownership Transfer",
content=(
"Requires: written request from owner OR legal docs if unavailable, identity verification of new owner, "
"Trust & Safety approval. Timeline: 2-5 business days. Data preserved. "
"Escalate to account-security@company.com with documentation."
),
applicable_categories=[TicketCategory.ACCOUNT],
relevance_score=0.95,
),
KnowledgeBaseArticle(
article_id="KB-004",
title="API Error Troubleshooting",
content=(
"For 500 errors: check status.company.com. If no incident, collect: request_id, endpoint, payload, timestamp. "
"Escalate to engineering. For enterprise pipeline impact, page on-call immediately. "
"Provide workaround if available."
),
applicable_categories=[TicketCategory.TECHNICAL],
relevance_score=0.92,
),
KnowledgeBaseArticle(
article_id="KB-005",
title="Abuse and Phishing Handling",
content=(
"Steps: (1) acknowledge within 1hr, (2) disable reported account pending investigation, "
"(3) escalate to Trust & Safety, (4) preserve evidence, (5) notify reporter within 24hr. "
"Never share investigation details with either party until resolved."
),
applicable_categories=[TicketCategory.ABUSE],
relevance_score=0.98,
),
KnowledgeBaseArticle(
article_id="KB-006",
title="Team Member Invitations",
content=(
"Invite: Settings > Team > Invite Members > Enter emails. "
"Pro: up to 5 members. Business: up to 25. Enterprise: unlimited. "
"Invites expire after 7 days. Roles: Admin, Editor, Viewer."
),
applicable_categories=[TicketCategory.ACCOUNT],
relevance_score=0.88,
),
KnowledgeBaseArticle(
article_id="KB-007",
title="Feature Request Process",
content=(
"Feature requests logged at roadmap.company.com. Customers can upvote or submit. "
"Enterprise can request acceleration through CSM. "
"Never promise delivery timelines. Encourage upvoting."
),
applicable_categories=[TicketCategory.FEATURE_REQUEST],
relevance_score=0.85,
),
]
def get_relevant_articles(category, top_k=2):
relevant = [a for a in KNOWLEDGE_BASE if category in a.applicable_categories]
relevant.sort(key=lambda x: x.relevance_score, reverse=True)
return relevant[:top_k]