Skip to content

Commit 04cb117

Browse files
Merge branch 'main' of https://github.com/parvbhullar/unpod
# Conflicts: # .gitignore # apps/backend-core/config/settings/base.py # apps/backend-core/unpod/common/services/livekit.py # apps/backend-core/unpod/common/utils.py # apps/backend-core/unpod/core_components/reports/daily.py # apps/backend-core/unpod/core_components/serializers.py # apps/backend-core/unpod/core_components/services.py # apps/backend-core/unpod/core_components/tasks/utils.py # apps/backend-core/unpod/core_components/views.py # apps/backend-core/unpod/users/tests/test_forms.py # apps/super/Dockerfile # apps/super/deployment/cerebrium/Dockerfile # apps/super/deployment/cerebrium/cerebrium.toml # apps/super/deployment/cerebrium/setup.py # apps/super/deployment/modal/modal_app.py # apps/super/deployment/modal/setup.py # apps/super/pyproject.toml # apps/super/requirements/super.txt # apps/super/requirements/super_services.txt # apps/super/scripts/test_voice_agent_coverage.sh # apps/super/scripts/test_voice_agent_suite.sh # apps/super/super/app/call_execution.py # apps/super/super/app/providers/__init__.py # apps/super/super/app/providers/factory.py # apps/super/super/core/voice/livekit/event_bridge.py # apps/super/super/core/voice/livekit/lite_handler.py # apps/super/super/core/voice/livekit/livekit_lite_agent.py # apps/super/super/core/voice/livekit/state_observer.py # apps/super/super/core/voice/pipecat/lite_handler.py # apps/super/super/core/voice/pipecat/services.py # apps/super/super/core/voice/plugins/transcript_plugin.py # apps/super/super/core/voice/providers/base.py # apps/super/super/core/voice/services/lazy_factory.py # apps/super/super/core/voice/services/livekit_services.py # apps/super/super/core/voice/voice_agent_handler.py # apps/super/super/pyproject.toml # apps/super/super_services/evals/eval_generator.py # apps/super/super_services/libs/config.py # apps/super/super_services/orchestration/cron_jobs/eval_testing.py # apps/super/super_services/orchestration/cron_jobs/post_call.py # apps/super/super_services/orchestration/executors/voice_executor_v3.py # apps/super/super_services/orchestration/task/deployments/requirements.txt # apps/super/super_services/orchestration/task/task_service.py # apps/super/super_services/voice/consumers/prefect_task_consumer.py # apps/super/tests/conftest.py # apps/super/tests/core/voice/helpers/runtime_imports.py # apps/super/tests/core/voice/livekit/test_lite_handler_cleanup.py # apps/super/tests/core/voice/services/test_livekit_config_parity.py # apps/super/tests/core/voice/services/test_pipecat_inference.py # apps/super/tests/core/voice/test_kb_chroma_kn_base_integration.py # apps/super/tests/core/voice/test_voice_agent_suite_manifest.py
2 parents 7d76264 + 48d1a83 commit 04cb117

55 files changed

Lines changed: 7544 additions & 2257 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ next-env.d.ts
6161
# Environment
6262
.env
6363
.env.*
64+
*.env
6465
!.env.example
6566
!.env.*.example
6667
.env.local

apps/backend-core/unpod/common/services/livekit.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
import time
2-
3-
import jwt
4-
import requests
5-
from django.conf import settings
6-
7-
81
def get_livekit_trunks():
92
url = f"https://{settings.LIVEKIT_BASE}/twirp/livekit.SIP/ListSIPInboundTrunk"
103

apps/backend-core/unpod/core_components/reports/daily.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def get_data_mongo(collection, today, query: dict = {}):
8686
)
8787

8888

89-
def get_org_wise_data_mongo(collection, today, query: dict = {}):
89+
def get_hubwise_data_mongo(collection, today, query: dict = {}):
9090
week_date = today - timezone.timedelta(days=7)
9191
month_date = today - timezone.timedelta(days=30)
9292
last_day = today - timezone.timedelta(days=1)
@@ -141,31 +141,31 @@ def get_org_wise_data_mongo(collection, today, query: dict = {}):
141141
}
142142

143143

144-
def merge_organization_data(orgDataDictId, space_data, post_data):
144+
def merge_hub_data(organizationDictId, space_data, post_data):
145145
merged_data = {}
146-
for organization in orgDataDictId:
147-
merge_org_data = []
146+
for organization in organizationDictId:
147+
merge_hub_data = []
148148
stats_keys = ["total", "today", "last_day", "weekly", "monthly"]
149149
for stats in stats_keys:
150-
merge_org_data.append(space_data[stats].get(organization, 0))
151-
merge_org_data.append(post_data[stats].get(organization, 0))
152-
merged_data[orgDataDictId[organization]["name"]] = merge_org_data
150+
merge_hub_data.append(space_data[stats].get(organization, 0))
151+
merge_hub_data.append(post_data[stats].get(organization, 0))
152+
merged_data[organizationDictId[organization]["name"]] = merge_hub_data
153153
return merged_data
154154

155155

156-
def orgWiseData(organizationList, today=None):
156+
def hubWiseData(hubData, today=None):
157157
if today is None:
158158
today = timezone.now().date().today()
159-
orgDataDictId = {}
160-
orgDataDictHandle = {}
161-
for each in organizationList:
162-
orgDataDictHandle[each["domain_handle"]] = each
163-
orgDataDictId[each["id"]] = each
159+
hubDataDictId = {}
160+
hubDataDictHandle = {}
161+
for each in hubData:
162+
hubDataDictHandle[each["domain_handle"]] = each
163+
hubDataDictId[each["id"]] = each
164164
space_data = Space.objects.all()
165165
post_data = ThreadPost.objects.all()
166-
space_data = get_organization_group_data(space_data, today, "space_organization_id")
167-
post_data = get_organization_group_data(post_data, today, "space__space_organization_id")
168-
merged_data = merge_organization_data(orgDataDictId, space_data, post_data)
166+
space_data = get_hub_group_data(space_data, today, "space_organization_id")
167+
post_data = get_hub_group_data(post_data, today, "space__space_organization_id")
168+
merged_data = merge_hub_data(hubDataDictId, space_data, post_data)
169169
return merged_data
170170

171171

@@ -210,7 +210,7 @@ def dailyActivityReport():
210210
body += "<br><br>"
211211
body += """<h3 style="text-align:center; margin-top:10px;">Last 30 Days Organization Wise Data</h3>"""
212212
organizationList = SpaceOrganization.objects.all().values("id", "domain_handle", "name")
213-
organizationData = orgWiseData(organizationList, today)
213+
organizationData = hubWiseData(organizationList, today)
214214
body += """
215215
<table width="100%" border="2" cellspacing="10" cellpadding="10" rules="ALL" style="border-collapse:collapse;color:#1f2240;background-color:#fff;padding:10px">
216216
<tr>
@@ -237,7 +237,7 @@ def dailyActivityReport():
237237
"""
238238
organizationWisePilotData = {}
239239
for organization in organizationList:
240-
pilot_data = get_org_wise_data_mongo(
240+
pilot_data = get_hubwise_data_mongo(
241241
"task_request_log", today, {"org_id": organization["id"]}
242242
)
243243
organizationWisePilotData[organization["name"]] = pilot_data

apps/backend-core/unpod/core_components/serializers.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,6 @@ class PilotFullSerializer(serializers.ModelSerializer):
413413
template = serializers.CharField(source="template.slug", read_only=True)
414414
eval_kn_bases = serializers.SerializerMethodField()
415415
eval_knowledge_bases = serializers.SerializerMethodField()
416-
pilot_eval_info = serializers.SerializerMethodField()
417416

418417
class Meta:
419418
model = Pilot
@@ -481,7 +480,6 @@ class Meta:
481480
"realtime_evals",
482481
"eval_kn_bases",
483482
"eval_knowledge_bases",
484-
"pilot_eval_info",
485483
"components",
486484
)
487485

@@ -582,29 +580,6 @@ def get_eval_knowledge_bases(self, obj):
582580
obj.eval_kn_bases.all().values("name", "slug", "token")
583581
)
584582

585-
def get_pilot_eval_info(self, obj):
586-
from unpod.knowledge_base.models import KnowledgeBaseEvals
587-
eval_info = KnowledgeBaseEvals.objects.filter(
588-
linked_handle=obj.handle, eval_type="pilot"
589-
).first()
590-
eval_data = {}
591-
if eval_info:
592-
eval_data = {
593-
"eval_name": eval_info.eval_name,
594-
"eval_type": eval_info.eval_type,
595-
"linked_handle": eval_info.linked_handle,
596-
"gen_status": eval_info.gen_status,
597-
}
598-
if eval_info.eval_data:
599-
eval_data["eval_token"] = eval_info.eval_data.get("space_token")
600-
if eval_data.get("eval_token"):
601-
eval_slug = Space.objects.filter(
602-
token=eval_data["eval_token"], space_type="knowledge_base"
603-
).values("slug").first()
604-
if eval_slug:
605-
eval_data["eval_slug"] = eval_slug["slug"]
606-
return eval_data
607-
608583
def get_organization(self, obj):
609584
if hasattr(obj, "owner"):
610585
return SpaceOrganizationSerializers(obj.owner).data

apps/backend-core/unpod/core_components/services.py

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -371,40 +371,32 @@ def process_pilot_knowledge_bases(pilot, knowledge_bases, is_update=False):
371371
if knowledge_bases is None:
372372
return
373373

374-
total_req_kb = len(knowledge_bases)
374+
# Validate all knowledge bases exist
375+
kb_count = Space.objects.filter(
376+
slug__in=knowledge_bases, space_type=SpaceType.knowledge_base.name
377+
).count()
378+
379+
if kb_count != len(knowledge_bases):
380+
raise APIException206(detail={"message": "Knowledge Bases Not Found"})
381+
382+
kbs = Space.objects.filter(
383+
slug__in=knowledge_bases, space_type=SpaceType.knowledge_base.name
384+
)
385+
375386
content_type = ContentType.objects.get_for_model(Space)
376387

377-
if total_req_kb == 0 or (total_req_kb == 1 and knowledge_bases[0] == "--"):
388+
# For updates, delete existing KB links
389+
if is_update:
378390
PilotLink.objects.filter(
379391
pilot=pilot,
380392
content_type=content_type,
381393
spaces__space_type=SpaceType.knowledge_base.name,
382394
).delete()
383-
else:
384-
# Validate all knowledge bases exist
385-
kb_count = Space.objects.filter(
386-
slug__in=knowledge_bases, space_type=SpaceType.knowledge_base.name
387-
).count()
388-
389-
if kb_count != total_req_kb:
390-
raise APIException206(detail={"message": "Knowledge Bases Not Found"})
391-
392-
kbs = Space.objects.filter(
393-
slug__in=knowledge_bases, space_type=SpaceType.knowledge_base.name
394-
)
395395

396-
# For updates, delete existing KB links
397-
if is_update:
398-
PilotLink.objects.filter(
399-
pilot=pilot,
400-
content_type=content_type,
401-
spaces__space_type=SpaceType.knowledge_base.name,
402-
).delete()
403-
404-
# Bulk create new KB links
405-
PilotLink.objects.bulk_create(
406-
[PilotLink(pilot=pilot, content_object=kb) for kb in kbs]
407-
)
396+
# Bulk create new KB links
397+
PilotLink.objects.bulk_create(
398+
[PilotLink(pilot=pilot, content_object=kb) for kb in kbs]
399+
)
408400

409401
@staticmethod
410402
def process_pilot_components(pilot, components, request):

apps/backend-core/unpod/users/tests/test_forms.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
import pytest
55
from django.utils.translation import gettext_lazy as _
66

7-
from unpod.users.forms import UserAdminCreationForm
7+
from unpod.users.forms import UserCreationForm
88
from unpod.users.models import User
99

1010
pytestmark = pytest.mark.django_db
1111

1212

13-
class TestUserAdminCreationForm:
13+
class TestUserCreationForm:
1414
"""
15-
Test class for all tests related to the UserAdminCreationForm
15+
Test class for all tests related to the UserCreationForm
1616
"""
1717

1818
def test_username_validation_error_msg(self, user: User):
@@ -25,7 +25,7 @@ def test_username_validation_error_msg(self, user: User):
2525

2626
# The user already exists,
2727
# hence cannot be created.
28-
form = UserAdminCreationForm(
28+
form = UserCreationForm(
2929
{
3030
"username": user.username,
3131
"password1": user.password,

apps/super/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ COPY --from=builder /app /app
6464
ENV SETTINGS_FILE="super_services.settings.qa"
6565
ENV PATH="/app/.venv/bin:$PATH"
6666
RUN SKIP_DB_CHECK=1 python super_services/orchestration/executors/voice_executor_v3.py download-files
67+
RUN python -c "from chromadb.utils.embedding_functions import ONNXMiniLM_L6_V2; ONNXMiniLM_L6_V2()"
6768

6869
# Switch to non-privileged user
6970
RUN chown -R appuser:appuser /app

apps/super/deployment/cerebrium/Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ COPY __init__.py .
2121
ENV PYTHONPATH="/app"
2222
ENV PYTHONUNBUFFERED=1
2323
ENV SETTINGS_FILE="super_services.settings.prod"
24+
# Pin HuggingFace cache inside /app so models survive build→runtime
25+
ENV HF_HOME="/app/.hf_cache"
2426

2527
# Pre-download ML models at build time (SKIP_DB_CHECK: no DB during build)
2628
RUN SKIP_DB_CHECK=1 python super_services/orchestration/executors/voice_executor_v3.py download-files

apps/super/deployment/cerebrium/cerebrium.toml

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,41 @@ exclude = [
3232
cpu = 4
3333
memory = 8.0
3434
compute = "CPU"
35+
provider = "aws"
36+
region = "us-east-1"
3537

3638
[cerebrium.scaling]
3739
min_replicas = 1
3840
max_replicas = 5
3941
cooldown = 30
4042
replica_concurrency = 1
4143

44+
[cerebrium.dependencies.apt]
45+
gcc = "latest"
46+
"g++" = "latest"
47+
python3-dev = "latest"
48+
libpq-dev = "latest"
49+
git = "latest"
50+
curl = "latest"
51+
portaudio19-dev = "latest"
52+
ffmpeg = "latest"
53+
libsndfile1 = "latest"
54+
4255
[cerebrium.dependencies.paths]
4356
pip = "requirements.txt"
4457

58+
[cerebrium.environment]
59+
PYTHONPATH = "/cortex"
60+
PYTHONUNBUFFERED = "1"
61+
SETTINGS_FILE = "super_services.settings.prod"
62+
HF_HOME = "/cortex/.hf_cache"
63+
64+
[cerebrium.build]
65+
shell_commands = [
66+
"SKIP_DB_CHECK=1 python /cortex/super_services/orchestration/executors/voice_executor_v3.py download-files",
67+
]
68+
4569
[cerebrium.runtime.custom]
70+
entrypoint = ["python", "-u", "/cortex/super_services/orchestration/executors/voice_executor_v3.py", "start"]
4671
port = 8600
47-
dockerfile_path = "./deployment/cerebrium/Dockerfile"
72+
healthcheck_endpoint = "/"

0 commit comments

Comments
 (0)