Spaces:
Building
Building
Update admin_routes.py
Browse files- admin_routes.py +59 -0
admin_routes.py
CHANGED
@@ -602,6 +602,65 @@ async def get_project_versions(
|
|
602 |
"versions": versions
|
603 |
}
|
604 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
605 |
# ===================== API Endpoints =====================
|
606 |
@router.get("/apis")
|
607 |
async def list_apis(
|
|
|
602 |
"versions": versions
|
603 |
}
|
604 |
|
605 |
+
@router.get("/projects/{project_id}/versions/{version1_id}/compare/{version2_id}")
|
606 |
+
async def compare_versions(
|
607 |
+
project_id: int,
|
608 |
+
version1_id: int,
|
609 |
+
version2_id: int,
|
610 |
+
username: str = Depends(verify_token)
|
611 |
+
):
|
612 |
+
"""Compare two versions and return differences"""
|
613 |
+
project = ConfigProvider.get_project(project_id)
|
614 |
+
if not project:
|
615 |
+
raise HTTPException(status_code=404, detail="Project not found")
|
616 |
+
|
617 |
+
v1 = next((v for v in project.versions if v.id == version1_id), None)
|
618 |
+
v2 = next((v for v in project.versions if v.id == version2_id), None)
|
619 |
+
|
620 |
+
if not v1 or not v2:
|
621 |
+
raise HTTPException(status_code=404, detail="Version not found")
|
622 |
+
|
623 |
+
# Deep comparison
|
624 |
+
differences = {
|
625 |
+
'general_prompt': {
|
626 |
+
'changed': v1.general_prompt != v2.general_prompt,
|
627 |
+
'v1': v1.general_prompt,
|
628 |
+
'v2': v2.general_prompt
|
629 |
+
},
|
630 |
+
'intents': {
|
631 |
+
'added': [],
|
632 |
+
'removed': [],
|
633 |
+
'modified': []
|
634 |
+
}
|
635 |
+
}
|
636 |
+
|
637 |
+
# Compare intents
|
638 |
+
v1_intents = {i.name: i for i in v1.intents}
|
639 |
+
v2_intents = {i.name: i for i in v2.intents}
|
640 |
+
|
641 |
+
# Find added/removed
|
642 |
+
differences['intents']['added'] = list(set(v2_intents.keys()) - set(v1_intents.keys()))
|
643 |
+
differences['intents']['removed'] = list(set(v1_intents.keys()) - set(v2_intents.keys()))
|
644 |
+
|
645 |
+
# Find modified
|
646 |
+
for intent_name in set(v1_intents.keys()) & set(v2_intents.keys()):
|
647 |
+
i1, i2 = v1_intents[intent_name], v2_intents[intent_name]
|
648 |
+
if i1.model_dump() != i2.model_dump():
|
649 |
+
differences['intents']['modified'].append({
|
650 |
+
'name': intent_name,
|
651 |
+
'differences': compare_intent_details(i1, i2)
|
652 |
+
})
|
653 |
+
|
654 |
+
log_info(
|
655 |
+
f"Version comparison performed",
|
656 |
+
user=username,
|
657 |
+
project_id=project_id,
|
658 |
+
version1_id=version1_id,
|
659 |
+
version2_id=version2_id
|
660 |
+
)
|
661 |
+
|
662 |
+
return differences
|
663 |
+
|
664 |
# ===================== API Endpoints =====================
|
665 |
@router.get("/apis")
|
666 |
async def list_apis(
|