myrmidon / python /src /server /services /marketing /sales_pitch.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
3.38 kB
import asyncio
import uuid
from typing import Any
from google import genai
from google.genai import types
from ...config.model_ssot import SYSTEM_MODELS
from ...prompts.sales_prompts import SALES_PITCH_SYSTEM_PROMPT
from ...utils.retry_utils import retry_with_backoff
from ..log_service import LogService
from ..prompt_service import prompt_service
from ..token_usage_service import TokenUsageService
from .content_handler import get_logger
logger = get_logger(__name__)
class SalesPitchGenerator:
"""Handles sales pitch AI generation workflows."""
def __init__(self, supabase_client: Any):
self.supabase_client = supabase_client
async def generate_pitch(self, company: str, job_title: str) -> dict:
try:
from ..credential_service import credential_service
api_key = await credential_service.get_credential("GEMINI_API_KEY")
if not api_key:
return {"error_code": 401, "message": "GEMINI_API_KEY missing."}
rag_strategy_creds = await credential_service.get_credentials_by_category("rag_strategy")
marketing_model = rag_strategy_creds.get("MARKETING_MODEL") or SYSTEM_MODELS["DEFAULT_TEXT"]
client = genai.Client(api_key=api_key)
sys_prompt = prompt_service.get_prompt("SALES_PITCH", SALES_PITCH_SYSTEM_PROMPT)
@retry_with_backoff(max_retries=2)
async def _call_gemini():
return await client.aio.models.generate_content(
model=marketing_model,
contents=f"Company: {company}\nRole: {job_title}",
config=types.GenerateContentConfig(system_instruction=sys_prompt),
)
response = await _call_gemini()
# Token Logging
try:
from ..agent_registry import get_agent_uuid
agent_uuid = get_agent_uuid("market-bot")
asyncio.create_task(
TokenUsageService.log_usage(
request_id=f"pitch-{uuid.uuid4().hex[:8]}",
user_id=agent_uuid,
model=SYSTEM_MODELS["DEFAULT_TEXT"],
provider="google",
input_tokens=getattr(response.usage_metadata, "prompt_token_count", 0) or 0,
output_tokens=getattr(response.usage_metadata, "candidates_token_count", 0) or 0,
context_type="sales_pitch_generation",
)
)
except Exception as log_err:
logger.warning(f"SalesPitchGenerator: Failed to log pitch tokens: {log_err}")
return {"content": response.text or "AI Error", "references": []}
except Exception as e:
logger.error(f"SalesPitchGenerator: Pitch generation failed: {e}")
try:
LogService(self.supabase_client).create_log_entry(
{
"user_input": f"Pitch Request: {company} / {job_title}",
"gemini_response": f"AI Error: {str(e)[:500]}",
"project_name": "SalesBot",
"user_name": "alice@archon.com",
}
)
except Exception:
pass
return {"error_code": 500, "message": str(e)}