From e7c429fc235da530d1420211b0a221fb03cc8d9e Mon Sep 17 00:00:00 2001 From: Bhumika Soam Date: Sat, 26 Sep 2026 08:55:58 +0530 Subject: [PATCH 01/10] chore: stop tracking .env, add to gitignore, backend: swap to SQLite for local dev, skip alembic migrations --- .env | 18 ------------------ .gitignore | 2 ++ backend/app/core/config.py | 4 +--- backend/app/core/db.py | 9 +++------ 4 files changed, 6 insertions(+), 27 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index e16784221f..0000000000 --- a/.env +++ /dev/null @@ -1,18 +0,0 @@ -# Enable development behavior for commands that import the app directly -FASTAPI_ENV=development - -PROJECT_NAME="Full Stack FastAPI Project" - -SECRET_KEY=changethis -FIRST_SUPERUSER=admin@example.com -FIRST_SUPERUSER_PASSWORD=changethis - -# Emails -SMTP_HOST=localhost -EMAILS_FROM_EMAIL=info@example.com -SMTP_TLS=False -SMTP_PORT=1025 - -# Postgres -POSTGRES_PASSWORD=changethis -DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@localhost:5432/app diff --git a/.gitignore b/.gitignore index 3c697eb7da..d72185127e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ backend/app/frontend/ /playwright-report/ /blob-report/ /playwright/.cache/ +.env +*.db \ No newline at end of file diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 095f72eeca..21d9446b06 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -28,7 +28,7 @@ class Settings(BaseSettings): PROJECT_NAME: str SENTRY_DSN: HttpUrl | None = None - DATABASE_URL: PostgresDsn + DATABASE_URL: str @field_validator("DATABASE_URL", mode="before") @classmethod @@ -79,8 +79,6 @@ def _check_default_secret(self, var_name: str, value: str | None) -> None: @model_validator(mode="after") def _enforce_non_default_secrets(self) -> Self: self._check_default_secret("SECRET_KEY", self.SECRET_KEY) - for host in self.DATABASE_URL.hosts(): - self._check_default_secret("DATABASE_URL password", host["password"]) self._check_default_secret( "FIRST_SUPERUSER_PASSWORD", self.FIRST_SUPERUSER_PASSWORD ) diff --git a/backend/app/core/db.py b/backend/app/core/db.py index d11b0ebd59..cd23c07ec3 100644 --- a/backend/app/core/db.py +++ b/backend/app/core/db.py @@ -1,4 +1,4 @@ -from sqlmodel import Session, create_engine, select +from sqlmodel import Session, SQLModel, create_engine, select from app import crud from app.core.config import settings @@ -16,10 +16,7 @@ def init_db(session: Session) -> None: # Tables should be created with Alembic migrations # But if you don't want to use migrations, create # the tables un-commenting the next lines - # from sqlmodel import SQLModel - - # This works because the models are already imported and registered from app.models - # SQLModel.metadata.create_all(engine) + SQLModel.metadata.create_all(engine) user = session.exec( select(User).where(User.email == settings.FIRST_SUPERUSER) @@ -30,4 +27,4 @@ def init_db(session: Session) -> None: password=settings.FIRST_SUPERUSER_PASSWORD, is_superuser=True, ) - user = crud.create_user(session=session, user_create=user_in) + user = crud.create_user(session=session, user_create=user_in) \ No newline at end of file From a9cac4adaa2188d26b13f941dba9ce42d82a7d49 Mon Sep 17 00:00:00 2001 From: Bhumika Soam Date: Sat, 26 Sep 2026 08:58:36 +0530 Subject: [PATCH 02/10] chore : disabling migrations --- backend/scripts/prestart.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/scripts/prestart.sh b/backend/scripts/prestart.sh index e67852ba07..33a497ca8e 100644 --- a/backend/scripts/prestart.sh +++ b/backend/scripts/prestart.sh @@ -4,7 +4,8 @@ set -e set -x # Run migrations -alembic upgrade head +# alembic upgrade head +# as we are not migrating at all # Create initial data in DB python app/initial_data.py From 9d923337485e0b3f059acc2e17ce38bde4e669ef Mon Sep 17 00:00:00 2001 From: Bhumika Soam Date: Sat, 26 Sep 2026 11:13:22 +0530 Subject: [PATCH 03/10] chore : added mock json files for report viewer --- .../impact_reports/drift-endpoint-removed.json | 16 ++++++++++++++++ .../impact_reports/drift-field-renamed.json | 16 ++++++++++++++++ .../mocks/impact_reports/drift-type-changed.json | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 frontend/src/mocks/impact_reports/drift-endpoint-removed.json create mode 100644 frontend/src/mocks/impact_reports/drift-field-renamed.json create mode 100644 frontend/src/mocks/impact_reports/drift-type-changed.json diff --git a/frontend/src/mocks/impact_reports/drift-endpoint-removed.json b/frontend/src/mocks/impact_reports/drift-endpoint-removed.json new file mode 100644 index 0000000000..62c3a353b4 --- /dev/null +++ b/frontend/src/mocks/impact_reports/drift-endpoint-removed.json @@ -0,0 +1,16 @@ +{ + "change_id": "endpoint_removed_delete_item", + "change_type": "endpoint_removed", + "endpoint": "/items/{id}", + "method": "DELETE", + "summary_plain_english": "The endpoint to delete an item was removed entirely. Any frontend code calling this (e.g. a delete button) will now fail when clicked.", + "severity": "high", + "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "patch_applied": true, + "patch_description": "Removed the delete button and its API call from ItemCard.tsx, and removed the now-dead deleteItem() method from the generated client.", + "verify_status": "pass", + "verify_log": "tsc --noEmit: 0 errors. vitest: 3/3 passed.", + "old_schema_fragment": { "endpoint": "/items/{id}", "method": "DELETE" }, + "new_schema_fragment": null, + "detected_at": "2026-09-26T13:10:00Z" +} \ No newline at end of file diff --git a/frontend/src/mocks/impact_reports/drift-field-renamed.json b/frontend/src/mocks/impact_reports/drift-field-renamed.json new file mode 100644 index 0000000000..240e5f4489 --- /dev/null +++ b/frontend/src/mocks/impact_reports/drift-field-renamed.json @@ -0,0 +1,16 @@ +{ + "change_id": "field_renamed_full_name", + "change_type": "field_renamed", + "endpoint": "/items/{id}", + "method": "GET", + "summary_plain_english": "The 'full_name' field on Item was renamed to 'name'. Any frontend code reading item.full_name will now get undefined.", + "severity": "high", + "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "patch_applied": true, + "patch_description": "Updated ItemCard.tsx and the generated client type to use 'name' instead of 'full_name'.", + "verify_status": "pass", + "verify_log": "tsc --noEmit: 0 errors. vitest: 4/4 passed.", + "old_schema_fragment": { "full_name": "string" }, + "new_schema_fragment": { "name": "string" }, + "detected_at": "2026-09-26T13:00:00Z" +} \ No newline at end of file diff --git a/frontend/src/mocks/impact_reports/drift-type-changed.json b/frontend/src/mocks/impact_reports/drift-type-changed.json new file mode 100644 index 0000000000..99609e0951 --- /dev/null +++ b/frontend/src/mocks/impact_reports/drift-type-changed.json @@ -0,0 +1,16 @@ +{ + "change_id": "field_type_changed_price", + "change_type": "field_type_changed", + "endpoint": "/items/{id}", + "method": "GET", + "summary_plain_english": "The 'price' field on Item changed from a number to a string. Any frontend code doing math with item.price (e.g. formatting, totals) will now break or behave unexpectedly.", + "severity": "medium", + "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "patch_applied": true, + "patch_description": "Updated the client type for 'price' to string and wrapped its usage in ItemCard.tsx with Number() before formatting.", + "verify_status": "pass", + "verify_log": "tsc --noEmit: 0 errors. vitest: 4/4 passed.", + "old_schema_fragment": { "price": "integer" }, + "new_schema_fragment": { "price": "string" }, + "detected_at": "2026-09-26T13:05:00Z" +} \ No newline at end of file From 399642fb1a171f0b1c651c95fbf266759b1390c4 Mon Sep 17 00:00:00 2001 From: Bhumika Soam Date: Sat, 26 Sep 2026 13:25:23 +0530 Subject: [PATCH 04/10] chore : added the impact-report file running with mocks and the problem-solution md file in the docs --- docs/problem-solution-statement.md | 56 +++++++ .../drift-endpoint-removed.json | 0 .../drift-field-renamed.json | 0 .../drift-type-changed.json | 0 frontend/src/routeTree.gen.ts | 21 +++ frontend/src/routes/impact-report.tsx | 142 ++++++++++++++++++ frontend/src/types/impactReport.ts | 25 +++ 7 files changed, 244 insertions(+) create mode 100644 docs/problem-solution-statement.md rename frontend/src/mocks/{impact_reports => impact-reports}/drift-endpoint-removed.json (100%) rename frontend/src/mocks/{impact_reports => impact-reports}/drift-field-renamed.json (100%) rename frontend/src/mocks/{impact_reports => impact-reports}/drift-type-changed.json (100%) create mode 100644 frontend/src/routes/impact-report.tsx create mode 100644 frontend/src/types/impactReport.ts diff --git a/docs/problem-solution-statement.md b/docs/problem-solution-statement.md new file mode 100644 index 0000000000..1c6a937df5 --- /dev/null +++ b/docs/problem-solution-statement.md @@ -0,0 +1,56 @@ +# ContractGuard — Problem & Solution Statement + +When a backend API changes — a field is renamed, a type changes, a required +field is added, or an endpoint is removed — the frontend breaks silently. In +most REST setups there's no compile-time warning; the failure only surfaces +when a user hits a runtime error, or worse, when it's already live in +production. + +That's the bug ContractGuard exists to kill. + +Today, fixing it means a developer stops building and starts doing +archaeology: diffing two API versions by eye, grepping the frontend for +every usage, hoping they caught them all. It's slow. It's error-prone. And +it hits junior developers and fast-moving teams hardest — the ones without +a senior engineer who "just remembers" every API change by heart. This is +exactly the release/deployment and maintenance pain this challenge calls +out, and in small teams it doesn't happen occasionally — it happens every +sprint. + +## The Solution + +ContractGuard closes the loop that every existing tool leaves open. OpenAPI +linters, Pact contract tests, `tsc` errors — they all stop at the same +place: raise a flag, hand it to a human, walk away. ContractGuard doesn't +walk away. It detects the break, explains it in plain English, patches +every affected line of frontend code, verifies the fix actually compiles +and passes tests, and writes up what it did — automatically, end to end. + +## Under the Hood + +Four agents do the work a human used to: + +- **Diff Agent** — compares the backend's OpenAPI spec before and after a + change and flags exactly what broke. +- **Impact Agent** — hunts down every frontend file touching the changed + field or endpoint, so no call site gets missed. +- **Repair Agent** — built on IBM Bob 2.0's Agent mode, writes and applies + the real code fix. +- **Verify Agent** — runs the build and test suite to prove the fix works, + looping back to repair on failure rather than ever faking a pass. + +## Who It's For + +Any team shipping a typed frontend against an API that moves fast — the +kind of team where "who broke the build" is a recurring Slack message. Open +the Impact Report and a PM, a new hire, or a stressed developer at 2 AM +gets an instant, readable answer: what changed, why it matters, and what +was already fixed — no diff-reading required. + +## Why It's Different + +ContractGuard isn't a linter you can shrug off. It's the missing last mile +between detecting a break and surviving one — narrow enough to demo in +under 90 seconds, and backed by a metric no judge can argue with: a +breaking API change, going from silent production incident to +detected-explained-fixed-proven, with zero human hands on the frontend. \ No newline at end of file diff --git a/frontend/src/mocks/impact_reports/drift-endpoint-removed.json b/frontend/src/mocks/impact-reports/drift-endpoint-removed.json similarity index 100% rename from frontend/src/mocks/impact_reports/drift-endpoint-removed.json rename to frontend/src/mocks/impact-reports/drift-endpoint-removed.json diff --git a/frontend/src/mocks/impact_reports/drift-field-renamed.json b/frontend/src/mocks/impact-reports/drift-field-renamed.json similarity index 100% rename from frontend/src/mocks/impact_reports/drift-field-renamed.json rename to frontend/src/mocks/impact-reports/drift-field-renamed.json diff --git a/frontend/src/mocks/impact_reports/drift-type-changed.json b/frontend/src/mocks/impact-reports/drift-type-changed.json similarity index 100% rename from frontend/src/mocks/impact_reports/drift-type-changed.json rename to frontend/src/mocks/impact-reports/drift-type-changed.json diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index b45f83a1d3..e67e787d10 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -10,6 +10,7 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as LayoutRouteImport } from './routes/_layout' +import { Route as ImpactReportRouteImport } from './routes/impact-report' import { Route as LoginRouteImport } from './routes/login' import { Route as RecoverPasswordRouteImport } from './routes/recover-password' import { Route as ResetPasswordRouteImport } from './routes/reset-password' @@ -23,6 +24,11 @@ const LayoutRoute = LayoutRouteImport.update({ id: '/_layout', getParentRoute: () => rootRouteImport, } as any) +const ImpactReportRoute = ImpactReportRouteImport.update({ + id: '/impact-report', + path: '/impact-report', + getParentRoute: () => rootRouteImport, +} as any) const LoginRoute = LoginRouteImport.update({ id: '/login', path: '/login', @@ -66,6 +72,7 @@ const LayoutSettingsRoute = LayoutSettingsRouteImport.update({ export interface FileRoutesByFullPath { '/': typeof LayoutIndexRoute + '/impact-report': typeof ImpactReportRoute '/login': typeof LoginRoute '/recover-password': typeof RecoverPasswordRoute '/reset-password': typeof ResetPasswordRoute @@ -75,6 +82,7 @@ export interface FileRoutesByFullPath { '/settings': typeof LayoutSettingsRoute } export interface FileRoutesByTo { + '/impact-report': typeof ImpactReportRoute '/login': typeof LoginRoute '/recover-password': typeof RecoverPasswordRoute '/reset-password': typeof ResetPasswordRoute @@ -87,6 +95,7 @@ export interface FileRoutesByTo { export interface FileRoutesById { __root__: typeof rootRouteImport '/_layout': typeof LayoutRouteWithChildren + '/impact-report': typeof ImpactReportRoute '/login': typeof LoginRoute '/recover-password': typeof RecoverPasswordRoute '/reset-password': typeof ResetPasswordRoute @@ -100,6 +109,7 @@ export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: | '/' + | '/impact-report' | '/login' | '/recover-password' | '/reset-password' @@ -109,6 +119,7 @@ export interface FileRouteTypes { | '/settings' fileRoutesByTo: FileRoutesByTo to: + | '/impact-report' | '/login' | '/recover-password' | '/reset-password' @@ -120,6 +131,7 @@ export interface FileRouteTypes { id: | '__root__' | '/_layout' + | '/impact-report' | '/login' | '/recover-password' | '/reset-password' @@ -132,6 +144,7 @@ export interface FileRouteTypes { } export interface RootRouteChildren { LayoutRoute: typeof LayoutRouteWithChildren + ImpactReportRoute: typeof ImpactReportRoute LoginRoute: typeof LoginRoute RecoverPasswordRoute: typeof RecoverPasswordRoute ResetPasswordRoute: typeof ResetPasswordRoute @@ -147,6 +160,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof LayoutRouteImport parentRoute: typeof rootRouteImport } + '/impact-report': { + id: '/impact-report' + path: '/impact-report' + fullPath: '/impact-report' + preLoaderRoute: typeof ImpactReportRouteImport + parentRoute: typeof rootRouteImport + } '/login': { id: '/login' path: '/login' @@ -225,6 +245,7 @@ const LayoutRouteWithChildren = const rootRouteChildren: RootRouteChildren = { LayoutRoute: LayoutRouteWithChildren, + ImpactReportRoute: ImpactReportRoute, LoginRoute: LoginRoute, RecoverPasswordRoute: RecoverPasswordRoute, ResetPasswordRoute: ResetPasswordRoute, diff --git a/frontend/src/routes/impact-report.tsx b/frontend/src/routes/impact-report.tsx new file mode 100644 index 0000000000..9144657431 --- /dev/null +++ b/frontend/src/routes/impact-report.tsx @@ -0,0 +1,142 @@ +import { createFileRoute } from "@tanstack/react-router" +import { useState } from "react" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader } from "@/components/ui/card" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" +import type { ImpactReport } from "@/types/impactReport" + +import fieldRenamed from "@/mocks/impact-reports/drift-field-renamed.json" +import typeChanged from "@/mocks/impact-reports/drift-type-changed.json" +import endpointRemoved from "@/mocks/impact-reports/drift-endpoint-removed.json" + +export const Route = createFileRoute("/impact-report")({ + component: ImpactReportPage, + head: () => ({ + meta: [{ title: "Impact Report - ContractGuard" }], + }), +}) + +const scenarios: { key: string; label: string; data: ImpactReport }[] = [ + { key: "field-renamed", label: "Field Renamed", data: fieldRenamed as ImpactReport }, + { key: "type-changed", label: "Type Changed", data: typeChanged as ImpactReport }, + { key: "endpoint-removed", label: "Endpoint Removed", data: endpointRemoved as ImpactReport }, +] + +const severityStyles: Record = { + high: "bg-red-100 text-red-700 hover:bg-red-100", + medium: "bg-amber-100 text-amber-700 hover:bg-amber-100", + low: "bg-yellow-50 text-yellow-700 hover:bg-yellow-50", +} + +const verifyStyles: Record = { + pass: "bg-green-100 text-green-700 hover:bg-green-100", + fail: "bg-red-100 text-red-700 hover:bg-red-100", +} + +function ImpactReportCard({ report }: { report: ImpactReport }) { + return ( + + +
+

+ {report.summary_plain_english} +

+ + {report.severity} + +
+

+ {report.method} {report.endpoint} · {report.change_type} +

+
+ + +
+

Affected files

+
    + {report.affected_files.map((file) => ( +
  • {file}
  • + ))} +
+
+ +
+

+ {report.patch_applied ? "✅ Patch applied" : "❌ Patch not applied"} +

+

+ {report.patch_description} +

+
+ +
+ Verify: + + {report.verify_status} + +
+ +
+ + View verify log + +
+            {report.verify_log}
+          
+
+ + {(report.old_schema_fragment || report.new_schema_fragment) && ( +
+ + View schema diff + +
+
+

Old

+
+                  {report.old_schema_fragment
+                    ? JSON.stringify(report.old_schema_fragment, null, 2)
+                    : "—"}
+                
+
+
+

New

+
+                  {report.new_schema_fragment
+                    ? JSON.stringify(report.new_schema_fragment, null, 2)
+                    : "—"}
+                
+
+
+
+ )} +
+
+ ) +} + +function ImpactReportPage() { + const [active, setActive] = useState(scenarios[0].key) + + return ( +
+

ContractGuard — Impact Report

+ + + + {scenarios.map((s) => ( + + {s.label} + + ))} + + + {scenarios.map((s) => ( + + + + ))} + +
+ ) +} \ No newline at end of file diff --git a/frontend/src/types/impactReport.ts b/frontend/src/types/impactReport.ts new file mode 100644 index 0000000000..b9fddc2678 --- /dev/null +++ b/frontend/src/types/impactReport.ts @@ -0,0 +1,25 @@ +export type Severity = "high" | "medium" | "low"; +export type VerifyStatus = "pass" | "fail"; +export type ChangeType = + | "field_renamed" + | "field_type_changed" + | "field_added_required" + | "field_removed" + | "endpoint_removed"; + +export interface ImpactReport { + change_id: string; + change_type: ChangeType; + endpoint: string; + method: string; + summary_plain_english: string; + severity: Severity; + affected_files: string[]; + patch_applied: boolean; + patch_description: string; + verify_status: VerifyStatus; + verify_log: string; + old_schema_fragment: Record | null; + new_schema_fragment: Record | null; + detected_at: string; +} \ No newline at end of file From f5e687647315cb77e16247a0e34c6675f57cc591 Mon Sep 17 00:00:00 2001 From: mahigarg0403-blip Date: Sat, 26 Sep 2026 16:07:13 +0530 Subject: [PATCH 05/10] a branch --- backend/app/main.py | 6 + backend/app/models.py | 1 + backend/app/routes/reports.py | 35 ++++ backend/contractguard/diff_agent.py | 178 ++++++++++++++++++ .../schemas/diff_report.schema.json | 19 ++ backend/openapi_snapshots/main.json | 1 + 6 files changed, 240 insertions(+) create mode 100644 backend/app/routes/reports.py create mode 100644 backend/contractguard/diff_agent.py create mode 100644 backend/contractguard/schemas/diff_report.schema.json create mode 100644 backend/openapi_snapshots/main.json diff --git a/backend/app/main.py b/backend/app/main.py index f2352b706c..0022d17198 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -8,6 +8,10 @@ from app.api.main import api_router from app.core.config import settings +from app.routes import reports +# ... + + FRONTEND_DIR = Path(__file__).parent / "frontend" @@ -24,6 +28,8 @@ def custom_generate_unique_id(route: APIRoute) -> str: generate_unique_id_function=custom_generate_unique_id, ) +app.include_router(reports.router) + app.add_middleware( CORSMiddleware, allow_origins=[settings.FRONTEND_HOST], diff --git a/backend/app/models.py b/backend/app/models.py index dcedf9a2f5..ba81999ae6 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -76,6 +76,7 @@ class ItemBase(SQLModel): description: str | None = Field(default=None, max_length=255) + # Properties to receive on item creation class ItemCreate(ItemBase): pass diff --git a/backend/app/routes/reports.py b/backend/app/routes/reports.py new file mode 100644 index 0000000000..d279344a9c --- /dev/null +++ b/backend/app/routes/reports.py @@ -0,0 +1,35 @@ +""" +Serves generated diff/impact reports to the frontend. +Mount path: backend/app/routes/reports.py +""" + +import json +from pathlib import Path + +from fastapi import APIRouter, HTTPException + +router = APIRouter(prefix="/api/reports", tags=["reports"]) +REPORTS_DIR = Path("contractguard/reports") + + +@router.get("/") +def list_reports(): + """Summary list for the report viewer's landing page.""" + reports = [] + for file in sorted(REPORTS_DIR.glob("impact_report_*.json")): + data = json.loads(file.read_text()) + reports.append({ + "change_id": data.get("change_id"), + "severity": data.get("severity"), + "verify_status": data.get("verify_status"), + }) + return reports + + +@router.get("/{change_id}") +def get_report(change_id: str): + """Full detail for one scenario, e.g. GET /api/reports/field_renamed""" + file = REPORTS_DIR / f"impact_report_{change_id}.json" + if not file.exists(): + raise HTTPException(status_code=404, detail="Report not found") + return json.loads(file.read_text()) diff --git a/backend/contractguard/diff_agent.py b/backend/contractguard/diff_agent.py new file mode 100644 index 0000000000..bbf5378f76 --- /dev/null +++ b/backend/contractguard/diff_agent.py @@ -0,0 +1,178 @@ +""" +Diff Agent — Mahi's core deliverable. + +Usage: + python diff_agent.py + +What it does: + 1. Loads two OpenAPI specs (before/after a backend change). + 2. Extracts a simplified {endpoint: {field: type}} view of each. + 3. Diffs them and classifies each difference into one of: + field_renamed, field_type_changed, field_added_required, + field_removed, endpoint_removed + 4. Writes a list of diff entries matching diff_report.schema.json + +This is plain deterministic Python — no Bob calls needed here. Test it against +all 3 of your drift branches before handing off to Khushi. +""" + +import json +import sys +from datetime import datetime, timezone +from pathlib import Path + + +def load_spec(path: str) -> dict: + return json.loads(Path(path).read_text()) + + +def _resolve_schema_name(schema_obj: dict) -> str | None: + """Follow a $ref (including inside 'items' for arrays) to find the schema name.""" + if not schema_obj: + return None + if "$ref" in schema_obj: + return schema_obj["$ref"].split("/")[-1] + if "items" in schema_obj and "$ref" in schema_obj["items"]: + return schema_obj["items"]["$ref"].split("/")[-1] + return None + + +def _unwrap_list_envelope(schema_name: str, components: dict) -> str: + """ + Some endpoints (e.g. GET /items/) return a paginated envelope like: + { "data": [ {...ItemPublic...} ], "count": 5 } + rather than the item schema directly (this is ItemsPublic in the + standard tiangolo template). If `schema_name` looks like one of these + envelopes — has a "data" property that's an array of $ref items — this + resolves through to the *inner* item schema instead, since that's the + schema whose fields (title, description, etc.) actually matter for + drift detection. Non-envelope schemas pass through unchanged. + """ + schema = components.get(schema_name, {}) + props = schema.get("properties", {}) + data_prop = props.get("data", {}) + if data_prop.get("type") == "array": + inner_ref = data_prop.get("items", {}).get("$ref") + if inner_ref: + return inner_ref.split("/")[-1] + return schema_name + + +def get_endpoint_schemas(spec: dict) -> dict: + """ + Returns { "METHOD /path": { field_name: field_type } } using each + endpoint's 200-response body schema. Automatically unwraps paginated + "data"-envelope responses (e.g. ItemsPublic -> ItemPublic) so drift is + detected on the actual item fields, not the envelope shape. Extend this + if you also want to diff request bodies (POST/PUT) — same pattern, just + read details["requestBody"] instead of details["responses"]["200"]. + """ + result = {} + paths = spec.get("paths", {}) + components = spec.get("components", {}).get("schemas", {}) + + for path, methods in paths.items(): + for method, details in methods.items(): + if method.lower() not in ("get", "post", "put", "delete", "patch"): + continue + key = f"{method.upper()} {path}" + fields = {} + + responses = details.get("responses", {}) + ok_response = responses.get("200", {}) + content = ok_response.get("content", {}).get("application/json", {}) + schema_name = _resolve_schema_name(content.get("schema", {})) + + if schema_name and schema_name in components: + schema_name = _unwrap_list_envelope(schema_name, components) + + if schema_name and schema_name in components: + props = components[schema_name].get("properties", {}) + for field_name, field_def in props.items(): + fields[field_name] = field_def.get("type", "unknown") + + result[key] = fields + + return result + + +def diff_specs(old_spec: dict, new_spec: dict) -> list[dict]: + old_endpoints = get_endpoint_schemas(old_spec) + new_endpoints = get_endpoint_schemas(new_spec) + changes: list[dict] = [] + now = datetime.now(timezone.utc).isoformat() + + def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_frag: dict, severity: str) -> dict: + method, endpoint = key.split(" ", 1) + return { + "endpoint": endpoint, + "method": method, + "change_type": change_type, + "breaking": breaking, + "old_schema_fragment": old_frag, + "new_schema_fragment": new_frag, + "severity": severity, + "detected_at": now, + } + + for key, old_fields in old_endpoints.items(): + # Endpoint removed entirely + if key not in new_endpoints: + changes.append(base_entry(key, "endpoint_removed", True, old_fields, {}, "high")) + continue + + new_fields = new_endpoints[key] + removed = set(old_fields) - set(new_fields) + added = set(new_fields) - set(old_fields) + common = set(old_fields) & set(new_fields) + + # Heuristic: a removed field + an added field of the SAME type in the + # same commit is treated as a rename, not two separate changes. + for r in list(removed): + match = next((a for a in added if old_fields[r] == new_fields[a]), None) + if match: + changes.append(base_entry( + key, "field_renamed", True, + {r: old_fields[r]}, {match: new_fields[match]}, "high" + )) + removed.discard(r) + added.discard(match) + + for r in removed: + changes.append(base_entry(key, "field_removed", True, {r: old_fields[r]}, {}, "medium")) + + for a in added: + # A genuinely new field on a response is usually non-breaking (additive), + # but flagged low severity so the team can eyeball it. + changes.append(base_entry(key, "field_added_required", False, {}, {a: new_fields[a]}, "low")) + + for f in common: + if old_fields[f] != new_fields[f]: + changes.append(base_entry( + key, "field_type_changed", True, + {f: old_fields[f]}, {f: new_fields[f]}, "high" + )) + + return changes + + +def main(): + if len(sys.argv) != 4: + print("Usage: python diff_agent.py ") + sys.exit(1) + + old_path, new_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3] + old_spec = load_spec(old_path) + new_spec = load_spec(new_path) + + changes = diff_specs(old_spec, new_spec) + + Path(out_path).parent.mkdir(parents=True, exist_ok=True) + Path(out_path).write_text(json.dumps(changes, indent=2)) + print(f"Wrote {len(changes)} change(s) to {out_path}") + for c in changes: + print(f" - [{c['severity']}] {c['change_type']} on {c['method']} {c['endpoint']}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/contractguard/schemas/diff_report.schema.json b/backend/contractguard/schemas/diff_report.schema.json new file mode 100644 index 0000000000..2ac2eaa352 --- /dev/null +++ b/backend/contractguard/schemas/diff_report.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DiffReportEntry", + "type": "object", + "required": ["endpoint", "method", "change_type", "breaking", "severity", "detected_at"], + "properties": { + "endpoint": { "type": "string", "example": "/items/{id}" }, + "method": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE", "PATCH"] }, + "change_type": { + "type": "string", + "enum": ["field_renamed", "field_type_changed", "field_added_required", "field_removed", "endpoint_removed"] + }, + "breaking": { "type": "boolean" }, + "old_schema_fragment": { "type": "object" }, + "new_schema_fragment": { "type": "object" }, + "severity": { "type": "string", "enum": ["high", "medium", "low"] }, + "detected_at": { "type": "string", "format": "date-time" } + } +} diff --git a/backend/openapi_snapshots/main.json b/backend/openapi_snapshots/main.json new file mode 100644 index 0000000000..45bbe27dfd --- /dev/null +++ b/backend/openapi_snapshots/main.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file From 34557ec6905947392442f8b5187f19552387b216 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 26 Sep 2026 15:13:12 +0000 Subject: [PATCH 06/10] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format=20and=20upda?= =?UTF-8?q?te=20with=20pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- backend/app/core/db.py | 2 +- backend/app/main.py | 2 +- backend/app/models.py | 1 - backend/app/routes/reports.py | 12 ++-- backend/contractguard/diff_agent.py | 67 ++++++++++++++----- backend/openapi_snapshots/main.json | 2 +- docs/problem-solution-statement.md | 2 +- .../drift-endpoint-removed.json | 7 +- .../impact-reports/drift-field-renamed.json | 7 +- .../impact-reports/drift-type-changed.json | 7 +- frontend/src/routes/impact-report.tsx | 24 +++++-- frontend/src/types/impactReport.ts | 36 +++++----- 13 files changed, 112 insertions(+), 59 deletions(-) diff --git a/.gitignore b/.gitignore index d72185127e..39e8117579 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ backend/app/frontend/ /blob-report/ /playwright/.cache/ .env -*.db \ No newline at end of file +*.db diff --git a/backend/app/core/db.py b/backend/app/core/db.py index cd23c07ec3..d5f9ef2bb2 100644 --- a/backend/app/core/db.py +++ b/backend/app/core/db.py @@ -27,4 +27,4 @@ def init_db(session: Session) -> None: password=settings.FIRST_SUPERUSER_PASSWORD, is_superuser=True, ) - user = crud.create_user(session=session, user_create=user_in) \ No newline at end of file + user = crud.create_user(session=session, user_create=user_in) diff --git a/backend/app/main.py b/backend/app/main.py index 0022d17198..d6d1327e61 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -7,8 +7,8 @@ from app.api.main import api_router from app.core.config import settings - from app.routes import reports + # ... diff --git a/backend/app/models.py b/backend/app/models.py index ba81999ae6..dcedf9a2f5 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -76,7 +76,6 @@ class ItemBase(SQLModel): description: str | None = Field(default=None, max_length=255) - # Properties to receive on item creation class ItemCreate(ItemBase): pass diff --git a/backend/app/routes/reports.py b/backend/app/routes/reports.py index d279344a9c..fe3c016698 100644 --- a/backend/app/routes/reports.py +++ b/backend/app/routes/reports.py @@ -18,11 +18,13 @@ def list_reports(): reports = [] for file in sorted(REPORTS_DIR.glob("impact_report_*.json")): data = json.loads(file.read_text()) - reports.append({ - "change_id": data.get("change_id"), - "severity": data.get("severity"), - "verify_status": data.get("verify_status"), - }) + reports.append( + { + "change_id": data.get("change_id"), + "severity": data.get("severity"), + "verify_status": data.get("verify_status"), + } + ) return reports diff --git a/backend/contractguard/diff_agent.py b/backend/contractguard/diff_agent.py index bbf5378f76..48932b9a4f 100644 --- a/backend/contractguard/diff_agent.py +++ b/backend/contractguard/diff_agent.py @@ -18,7 +18,7 @@ import json import sys -from datetime import datetime, timezone +from datetime import UTC, datetime from pathlib import Path @@ -100,9 +100,16 @@ def diff_specs(old_spec: dict, new_spec: dict) -> list[dict]: old_endpoints = get_endpoint_schemas(old_spec) new_endpoints = get_endpoint_schemas(new_spec) changes: list[dict] = [] - now = datetime.now(timezone.utc).isoformat() - - def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_frag: dict, severity: str) -> dict: + now = datetime.now(UTC).isoformat() + + def base_entry( + key: str, + change_type: str, + breaking: bool, + old_frag: dict, + new_frag: dict, + severity: str, + ) -> dict: method, endpoint = key.split(" ", 1) return { "endpoint": endpoint, @@ -118,7 +125,9 @@ def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_f for key, old_fields in old_endpoints.items(): # Endpoint removed entirely if key not in new_endpoints: - changes.append(base_entry(key, "endpoint_removed", True, old_fields, {}, "high")) + changes.append( + base_entry(key, "endpoint_removed", True, old_fields, {}, "high") + ) continue new_fields = new_endpoints[key] @@ -131,34 +140,54 @@ def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_f for r in list(removed): match = next((a for a in added if old_fields[r] == new_fields[a]), None) if match: - changes.append(base_entry( - key, "field_renamed", True, - {r: old_fields[r]}, {match: new_fields[match]}, "high" - )) + changes.append( + base_entry( + key, + "field_renamed", + True, + {r: old_fields[r]}, + {match: new_fields[match]}, + "high", + ) + ) removed.discard(r) added.discard(match) for r in removed: - changes.append(base_entry(key, "field_removed", True, {r: old_fields[r]}, {}, "medium")) + changes.append( + base_entry(key, "field_removed", True, {r: old_fields[r]}, {}, "medium") + ) for a in added: # A genuinely new field on a response is usually non-breaking (additive), # but flagged low severity so the team can eyeball it. - changes.append(base_entry(key, "field_added_required", False, {}, {a: new_fields[a]}, "low")) + changes.append( + base_entry( + key, "field_added_required", False, {}, {a: new_fields[a]}, "low" + ) + ) for f in common: if old_fields[f] != new_fields[f]: - changes.append(base_entry( - key, "field_type_changed", True, - {f: old_fields[f]}, {f: new_fields[f]}, "high" - )) + changes.append( + base_entry( + key, + "field_type_changed", + True, + {f: old_fields[f]}, + {f: new_fields[f]}, + "high", + ) + ) return changes def main(): if len(sys.argv) != 4: - print("Usage: python diff_agent.py ") + print( + "Usage: python diff_agent.py " + ) sys.exit(1) old_path, new_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3] @@ -171,8 +200,10 @@ def main(): Path(out_path).write_text(json.dumps(changes, indent=2)) print(f"Wrote {len(changes)} change(s) to {out_path}") for c in changes: - print(f" - [{c['severity']}] {c['change_type']} on {c['method']} {c['endpoint']}") + print( + f" - [{c['severity']}] {c['change_type']} on {c['method']} {c['endpoint']}" + ) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/backend/openapi_snapshots/main.json b/backend/openapi_snapshots/main.json index 45bbe27dfd..de66347fd6 100644 --- a/backend/openapi_snapshots/main.json +++ b/backend/openapi_snapshots/main.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} diff --git a/docs/problem-solution-statement.md b/docs/problem-solution-statement.md index 1c6a937df5..935fd80b7c 100644 --- a/docs/problem-solution-statement.md +++ b/docs/problem-solution-statement.md @@ -53,4 +53,4 @@ ContractGuard isn't a linter you can shrug off. It's the missing last mile between detecting a break and surviving one — narrow enough to demo in under 90 seconds, and backed by a metric no judge can argue with: a breaking API change, going from silent production incident to -detected-explained-fixed-proven, with zero human hands on the frontend. \ No newline at end of file +detected-explained-fixed-proven, with zero human hands on the frontend. diff --git a/frontend/src/mocks/impact-reports/drift-endpoint-removed.json b/frontend/src/mocks/impact-reports/drift-endpoint-removed.json index 62c3a353b4..d77786d5a2 100644 --- a/frontend/src/mocks/impact-reports/drift-endpoint-removed.json +++ b/frontend/src/mocks/impact-reports/drift-endpoint-removed.json @@ -5,7 +5,10 @@ "method": "DELETE", "summary_plain_english": "The endpoint to delete an item was removed entirely. Any frontend code calling this (e.g. a delete button) will now fail when clicked.", "severity": "high", - "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "affected_files": [ + "frontend/src/components/ItemCard.tsx", + "frontend/src/api/client.ts" + ], "patch_applied": true, "patch_description": "Removed the delete button and its API call from ItemCard.tsx, and removed the now-dead deleteItem() method from the generated client.", "verify_status": "pass", @@ -13,4 +16,4 @@ "old_schema_fragment": { "endpoint": "/items/{id}", "method": "DELETE" }, "new_schema_fragment": null, "detected_at": "2026-09-26T13:10:00Z" -} \ No newline at end of file +} diff --git a/frontend/src/mocks/impact-reports/drift-field-renamed.json b/frontend/src/mocks/impact-reports/drift-field-renamed.json index 240e5f4489..a8e534024c 100644 --- a/frontend/src/mocks/impact-reports/drift-field-renamed.json +++ b/frontend/src/mocks/impact-reports/drift-field-renamed.json @@ -5,7 +5,10 @@ "method": "GET", "summary_plain_english": "The 'full_name' field on Item was renamed to 'name'. Any frontend code reading item.full_name will now get undefined.", "severity": "high", - "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "affected_files": [ + "frontend/src/components/ItemCard.tsx", + "frontend/src/api/client.ts" + ], "patch_applied": true, "patch_description": "Updated ItemCard.tsx and the generated client type to use 'name' instead of 'full_name'.", "verify_status": "pass", @@ -13,4 +16,4 @@ "old_schema_fragment": { "full_name": "string" }, "new_schema_fragment": { "name": "string" }, "detected_at": "2026-09-26T13:00:00Z" -} \ No newline at end of file +} diff --git a/frontend/src/mocks/impact-reports/drift-type-changed.json b/frontend/src/mocks/impact-reports/drift-type-changed.json index 99609e0951..e07577fab9 100644 --- a/frontend/src/mocks/impact-reports/drift-type-changed.json +++ b/frontend/src/mocks/impact-reports/drift-type-changed.json @@ -5,7 +5,10 @@ "method": "GET", "summary_plain_english": "The 'price' field on Item changed from a number to a string. Any frontend code doing math with item.price (e.g. formatting, totals) will now break or behave unexpectedly.", "severity": "medium", - "affected_files": ["frontend/src/components/ItemCard.tsx", "frontend/src/api/client.ts"], + "affected_files": [ + "frontend/src/components/ItemCard.tsx", + "frontend/src/api/client.ts" + ], "patch_applied": true, "patch_description": "Updated the client type for 'price' to string and wrapped its usage in ItemCard.tsx with Number() before formatting.", "verify_status": "pass", @@ -13,4 +16,4 @@ "old_schema_fragment": { "price": "integer" }, "new_schema_fragment": { "price": "string" }, "detected_at": "2026-09-26T13:05:00Z" -} \ No newline at end of file +} diff --git a/frontend/src/routes/impact-report.tsx b/frontend/src/routes/impact-report.tsx index 9144657431..88766435f4 100644 --- a/frontend/src/routes/impact-report.tsx +++ b/frontend/src/routes/impact-report.tsx @@ -3,11 +3,11 @@ import { useState } from "react" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import type { ImpactReport } from "@/types/impactReport" +import endpointRemoved from "@/mocks/impact-reports/drift-endpoint-removed.json" import fieldRenamed from "@/mocks/impact-reports/drift-field-renamed.json" import typeChanged from "@/mocks/impact-reports/drift-type-changed.json" -import endpointRemoved from "@/mocks/impact-reports/drift-endpoint-removed.json" +import type { ImpactReport } from "@/types/impactReport" export const Route = createFileRoute("/impact-report")({ component: ImpactReportPage, @@ -17,9 +17,21 @@ export const Route = createFileRoute("/impact-report")({ }) const scenarios: { key: string; label: string; data: ImpactReport }[] = [ - { key: "field-renamed", label: "Field Renamed", data: fieldRenamed as ImpactReport }, - { key: "type-changed", label: "Type Changed", data: typeChanged as ImpactReport }, - { key: "endpoint-removed", label: "Endpoint Removed", data: endpointRemoved as ImpactReport }, + { + key: "field-renamed", + label: "Field Renamed", + data: fieldRenamed as ImpactReport, + }, + { + key: "type-changed", + label: "Type Changed", + data: typeChanged as ImpactReport, + }, + { + key: "endpoint-removed", + label: "Endpoint Removed", + data: endpointRemoved as ImpactReport, + }, ] const severityStyles: Record = { @@ -139,4 +151,4 @@ function ImpactReportPage() { ) -} \ No newline at end of file +} diff --git a/frontend/src/types/impactReport.ts b/frontend/src/types/impactReport.ts index b9fddc2678..d2a8222884 100644 --- a/frontend/src/types/impactReport.ts +++ b/frontend/src/types/impactReport.ts @@ -1,25 +1,25 @@ -export type Severity = "high" | "medium" | "low"; -export type VerifyStatus = "pass" | "fail"; +export type Severity = "high" | "medium" | "low" +export type VerifyStatus = "pass" | "fail" export type ChangeType = | "field_renamed" | "field_type_changed" | "field_added_required" | "field_removed" - | "endpoint_removed"; + | "endpoint_removed" export interface ImpactReport { - change_id: string; - change_type: ChangeType; - endpoint: string; - method: string; - summary_plain_english: string; - severity: Severity; - affected_files: string[]; - patch_applied: boolean; - patch_description: string; - verify_status: VerifyStatus; - verify_log: string; - old_schema_fragment: Record | null; - new_schema_fragment: Record | null; - detected_at: string; -} \ No newline at end of file + change_id: string + change_type: ChangeType + endpoint: string + method: string + summary_plain_english: string + severity: Severity + affected_files: string[] + patch_applied: boolean + patch_description: string + verify_status: VerifyStatus + verify_log: string + old_schema_fragment: Record | null + new_schema_fragment: Record | null + detected_at: string +} From 0aed480e54e3aa28577d37f079428e80c31a1328 Mon Sep 17 00:00:00 2001 From: mahigarg0403-blip Date: Sat, 26 Sep 2026 22:07:30 +0530 Subject: [PATCH 07/10] fix: resolve .env path absolutely regardless of cwd; add diff engine + converter --- backend/app/core/config.py | 13 +- backend/contractguard/convert_diff_report.py | 0 backend/contractguard/diff_agent.py | 140 +- .../reports/diff_report_endpoint_removed.json | 14 + .../reports/diff_report_field_renamed.json | 16 + .../reports/diff_report_type_changed.json | 16 + backend/contractguard/reports/test_diff.json | 1 + backend/openapi_snapshots/all/baseline.json | 1 + .../all/drift_endpoint_removed.json | 1 + .../all/drift_field_renamed.json | 26 + .../all/drift_type_changed.json | 30 + .../openapi_snapshots/diff_agent_base.json | 1 + backend/openapi_snapshots/test_modified.json | 1236 +++++++++++++++++ 13 files changed, 1428 insertions(+), 67 deletions(-) create mode 100644 backend/contractguard/convert_diff_report.py create mode 100644 backend/contractguard/reports/diff_report_endpoint_removed.json create mode 100644 backend/contractguard/reports/diff_report_field_renamed.json create mode 100644 backend/contractguard/reports/diff_report_type_changed.json create mode 100644 backend/contractguard/reports/test_diff.json create mode 100644 backend/openapi_snapshots/all/baseline.json create mode 100644 backend/openapi_snapshots/all/drift_endpoint_removed.json create mode 100644 backend/openapi_snapshots/all/drift_field_renamed.json create mode 100644 backend/openapi_snapshots/all/drift_type_changed.json create mode 100644 backend/openapi_snapshots/diff_agent_base.json create mode 100644 backend/openapi_snapshots/test_modified.json diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 21d9446b06..163612f0db 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -1,6 +1,8 @@ import warnings from typing import Literal, Self +from pathlib import Path + from pydantic import ( EmailStr, HttpUrl, @@ -14,11 +16,12 @@ class Settings(BaseSettings): model_config = SettingsConfigDict( - # Use top level .env file (one level above ./backend/) - env_file="../.env", - env_ignore_empty=True, - extra="ignore", - ) + env_file=Path(__file__).resolve().parents[3] / ".env", + env_ignore_empty=True, + extra="ignore", +) + + API_V1_STR: str = "/api/v1" SECRET_KEY: str # 60 minutes * 24 hours * 8 days = 8 days diff --git a/backend/contractguard/convert_diff_report.py b/backend/contractguard/convert_diff_report.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backend/contractguard/diff_agent.py b/backend/contractguard/diff_agent.py index bbf5378f76..9c1a8edf00 100644 --- a/backend/contractguard/diff_agent.py +++ b/backend/contractguard/diff_agent.py @@ -3,17 +3,6 @@ Usage: python diff_agent.py - -What it does: - 1. Loads two OpenAPI specs (before/after a backend change). - 2. Extracts a simplified {endpoint: {field: type}} view of each. - 3. Diffs them and classifies each difference into one of: - field_renamed, field_type_changed, field_added_required, - field_removed, endpoint_removed - 4. Writes a list of diff entries matching diff_report.schema.json - -This is plain deterministic Python — no Bob calls needed here. Test it against -all 3 of your drift branches before handing off to Khushi. """ import json @@ -26,70 +15,101 @@ def load_spec(path: str) -> dict: return json.loads(Path(path).read_text()) -def _resolve_schema_name(schema_obj: dict) -> str | None: - """Follow a $ref (including inside 'items' for arrays) to find the schema name.""" - if not schema_obj: +def _resolve_ref(obj: dict) -> str | None: + if not isinstance(obj, dict): return None - if "$ref" in schema_obj: - return schema_obj["$ref"].split("/")[-1] - if "items" in schema_obj and "$ref" in schema_obj["items"]: - return schema_obj["items"]["$ref"].split("/")[-1] + if "$ref" in obj: + return obj["$ref"].split("/")[-1] + if "items" in obj and isinstance(obj["items"], dict) and "$ref" in obj["items"]: + return obj["items"]["$ref"].split("/")[-1] return None -def _unwrap_list_envelope(schema_name: str, components: dict) -> str: - """ - Some endpoints (e.g. GET /items/) return a paginated envelope like: - { "data": [ {...ItemPublic...} ], "count": 5 } - rather than the item schema directly (this is ItemsPublic in the - standard tiangolo template). If `schema_name` looks like one of these - envelopes — has a "data" property that's an array of $ref items — this - resolves through to the *inner* item schema instead, since that's the - schema whose fields (title, description, etc.) actually matter for - drift detection. Non-envelope schemas pass through unchanged. - """ - schema = components.get(schema_name, {}) +def _extract_type(field_def: dict) -> str: + if not isinstance(field_def, dict): + return "unknown" + if "type" in field_def: + t = field_def["type"] + if isinstance(t, list): + types = [x for x in t if x != "null"] + return types[0] if types else "null" + return str(t) + if "anyOf" in field_def or "oneOf" in field_def: + variants = field_def.get("anyOf") or field_def.get("oneOf") or [] + for v in variants: + if isinstance(v, dict): + if "$ref" in v: + return v["$ref"].split("/")[-1] + if "type" in v: + return str(v["type"]) + if "$ref" in field_def: + return field_def["$ref"].split("/")[-1] + return "unknown" + + +def _extract_fields_from_schema(schema: dict, components: dict) -> dict[str, str]: + fields = {} + if not isinstance(schema, dict): + return fields + + ref_name = _resolve_ref(schema) + if ref_name and ref_name in components: + schema = components[ref_name] + + # Unwrap allOf / anyOf wrappers + if "allOf" in schema: + for sub in schema["allOf"]: + fields.update(_extract_fields_from_schema(sub, components)) + props = schema.get("properties", {}) - data_prop = props.get("data", {}) - if data_prop.get("type") == "array": - inner_ref = data_prop.get("items", {}).get("$ref") - if inner_ref: - return inner_ref.split("/")[-1] - return schema_name + if isinstance(props, dict): + for fname, fdef in props.items(): + fields[fname] = _extract_type(fdef) + + return fields def get_endpoint_schemas(spec: dict) -> dict: - """ - Returns { "METHOD /path": { field_name: field_type } } using each - endpoint's 200-response body schema. Automatically unwraps paginated - "data"-envelope responses (e.g. ItemsPublic -> ItemPublic) so drift is - detected on the actual item fields, not the envelope shape. Extend this - if you also want to diff request bodies (POST/PUT) — same pattern, just - read details["requestBody"] instead of details["responses"]["200"]. - """ result = {} paths = spec.get("paths", {}) components = spec.get("components", {}).get("schemas", {}) for path, methods in paths.items(): + if not isinstance(methods, dict): + continue for method, details in methods.items(): - if method.lower() not in ("get", "post", "put", "delete", "patch"): + m = method.upper() + if m not in ("GET", "POST", "PUT", "DELETE", "PATCH"): continue - key = f"{method.upper()} {path}" - fields = {} - responses = details.get("responses", {}) - ok_response = responses.get("200", {}) - content = ok_response.get("content", {}).get("application/json", {}) - schema_name = _resolve_schema_name(content.get("schema", {})) + key = f"{m} {path}" + fields = {} - if schema_name and schema_name in components: - schema_name = _unwrap_list_envelope(schema_name, components) + # 1. Extract from Request Body (POST, PUT, PATCH) + req_body = details.get("requestBody", {}) + if isinstance(req_body, dict): + content = req_body.get("content", {}).get("application/json", {}) + req_schema = content.get("schema", {}) + fields.update(_extract_fields_from_schema(req_schema, components)) - if schema_name and schema_name in components: - props = components[schema_name].get("properties", {}) - for field_name, field_def in props.items(): - fields[field_name] = field_def.get("type", "unknown") + # 2. Extract from Responses (200, 201, 204, or default) + responses = details.get("responses", {}) + if isinstance(responses, dict): + res_obj = ( + responses.get("200") + or responses.get("201") + or responses.get("204") + or responses.get("200 OK") + or {} + ) + if isinstance(res_obj, dict): + content = res_obj.get("content", {}).get("application/json", {}) + res_schema = content.get("schema", {}) + fields.update(_extract_fields_from_schema(res_schema, components)) + + # Fallback if no explicit fields resolved + if not fields: + fields["$response"] = "void" if m == "DELETE" else "unknown" result[key] = fields @@ -116,7 +136,6 @@ def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_f } for key, old_fields in old_endpoints.items(): - # Endpoint removed entirely if key not in new_endpoints: changes.append(base_entry(key, "endpoint_removed", True, old_fields, {}, "high")) continue @@ -126,8 +145,7 @@ def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_f added = set(new_fields) - set(old_fields) common = set(old_fields) & set(new_fields) - # Heuristic: a removed field + an added field of the SAME type in the - # same commit is treated as a rename, not two separate changes. + # Rename heuristic: removed key + added key with matching type for r in list(removed): match = next((a for a in added if old_fields[r] == new_fields[a]), None) if match: @@ -142,8 +160,6 @@ def base_entry(key: str, change_type: str, breaking: bool, old_frag: dict, new_f changes.append(base_entry(key, "field_removed", True, {r: old_fields[r]}, {}, "medium")) for a in added: - # A genuinely new field on a response is usually non-breaking (additive), - # but flagged low severity so the team can eyeball it. changes.append(base_entry(key, "field_added_required", False, {}, {a: new_fields[a]}, "low")) for f in common: diff --git a/backend/contractguard/reports/diff_report_endpoint_removed.json b/backend/contractguard/reports/diff_report_endpoint_removed.json new file mode 100644 index 0000000000..dec75d02a9 --- /dev/null +++ b/backend/contractguard/reports/diff_report_endpoint_removed.json @@ -0,0 +1,14 @@ +[ + { + "endpoint": "/health", + "method": "GET", + "change_type": "endpoint_removed", + "breaking": true, + "old_schema_fragment": { + "$response": "unknown" + }, + "new_schema_fragment": {}, + "severity": "high", + "detected_at": "2026-09-26T12:35:38.858161+00:00" + } +] \ No newline at end of file diff --git a/backend/contractguard/reports/diff_report_field_renamed.json b/backend/contractguard/reports/diff_report_field_renamed.json new file mode 100644 index 0000000000..547c1b4b4c --- /dev/null +++ b/backend/contractguard/reports/diff_report_field_renamed.json @@ -0,0 +1,16 @@ +[ + { + "endpoint": "/chat", + "method": "POST", + "change_type": "field_renamed", + "breaking": true, + "old_schema_fragment": { + "answer": "string" + }, + "new_schema_fragment": { + "response_text": "string" + }, + "severity": "high", + "detected_at": "2026-09-26T12:32:56.064254+00:00" + } +] \ No newline at end of file diff --git a/backend/contractguard/reports/diff_report_type_changed.json b/backend/contractguard/reports/diff_report_type_changed.json new file mode 100644 index 0000000000..ed94597725 --- /dev/null +++ b/backend/contractguard/reports/diff_report_type_changed.json @@ -0,0 +1,16 @@ +[ + { + "endpoint": "/chat", + "method": "POST", + "change_type": "field_type_changed", + "breaking": true, + "old_schema_fragment": { + "top_k": "integer" + }, + "new_schema_fragment": { + "top_k": "string" + }, + "severity": "high", + "detected_at": "2026-09-26T12:32:56.215675+00:00" + } +] \ No newline at end of file diff --git a/backend/contractguard/reports/test_diff.json b/backend/contractguard/reports/test_diff.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/backend/contractguard/reports/test_diff.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/backend/openapi_snapshots/all/baseline.json b/backend/openapi_snapshots/all/baseline.json new file mode 100644 index 0000000000..45bbe27dfd --- /dev/null +++ b/backend/openapi_snapshots/all/baseline.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file diff --git a/backend/openapi_snapshots/all/drift_endpoint_removed.json b/backend/openapi_snapshots/all/drift_endpoint_removed.json new file mode 100644 index 0000000000..f96b4ac3c1 --- /dev/null +++ b/backend/openapi_snapshots/all/drift_endpoint_removed.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file diff --git a/backend/openapi_snapshots/all/drift_field_renamed.json b/backend/openapi_snapshots/all/drift_field_renamed.json new file mode 100644 index 0000000000..234cff0fae --- /dev/null +++ b/backend/openapi_snapshots/all/drift_field_renamed.json @@ -0,0 +1,26 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse": { + "properties": { + "session_id": { + "type": "string", + "title": "Session Id" + }, + "response_text": { + "type": "string", + "title": "Answer" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/ChatSource" + }, + "type": "array", + "title": "Sources" + } + }, + "type": "object", + "required": [ + "session_id", + "response_text", + "sources" + ], + "title": "ChatResponse" +},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file diff --git a/backend/openapi_snapshots/all/drift_type_changed.json b/backend/openapi_snapshots/all/drift_type_changed.json new file mode 100644 index 0000000000..2edf4ae975 --- /dev/null +++ b/backend/openapi_snapshots/all/drift_type_changed.json @@ -0,0 +1,30 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery": { + "properties": { + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "session_id": { + "anyOf": [ + { "type": "string" }, + { "type": "null" } + ], + "title": "Session Id" + }, + "question": { + "type": "string", + "title": "Question" + }, + "top_k": { + "type": "string", + "title": "Top K", + "default": "5" + } + }, + "type": "object", + "required": [ + "tenant_id", + "question" + ], + "title": "ChatQuery" +},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file diff --git a/backend/openapi_snapshots/diff_agent_base.json b/backend/openapi_snapshots/diff_agent_base.json new file mode 100644 index 0000000000..45bbe27dfd --- /dev/null +++ b/backend/openapi_snapshots/diff_agent_base.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file diff --git a/backend/openapi_snapshots/test_modified.json b/backend/openapi_snapshots/test_modified.json new file mode 100644 index 0000000000..caa5a9ae99 --- /dev/null +++ b/backend/openapi_snapshots/test_modified.json @@ -0,0 +1,1236 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/": { + "get": { + "summary": "Read Root", + "operationId": "read_root__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/documents/{document_id}": { + "get": { + "summary": "Get Document", + "operationId": "get_document_documents__document_id__get", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "summary": "Update Document", + "operationId": "update_document_documents__document_id__put", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents": { + "post": { + "summary": "Create Document", + "operationId": "create_document_documents_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/db-check": { + "get": { + "summary": "Db Check", + "operationId": "db_check_db_check_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/tenants/{tenant_id}/widget-config": { + "get": { + "summary": "Get Widget Config", + "operationId": "get_widget_config_tenants__tenant_id__widget_config_get", + "parameters": [ + { + "name": "tenant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Tenant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tenants": { + "post": { + "summary": "Create Tenant", + "operationId": "create_tenant_tenants_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TenantCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/kb/upload": { + "post": { + "summary": "Upload Document", + "operationId": "upload_document_kb_upload_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_document_kb_upload_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/chat": { + "post": { + "summary": "Chat", + "operationId": "chat_chat_post", + "parameters": [ + { + "name": "origin", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Origin" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatQuery" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/chat/end": { + "post": { + "summary": "End Chat", + "operationId": "end_chat_chat_end_post", + "parameters": [ + { + "name": "origin", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Origin" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EndChatRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tenants/website-domain": { + "put": { + "summary": "Update Website Domain", + "operationId": "update_website_domain_tenants_website_domain_put", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebsiteDomainUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/invite/accept": { + "post": { + "summary": "Accept Invite", + "operationId": "accept_invite_invite_accept_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InviteAccept" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/pending-users": { + "get": { + "summary": "Get Pending Users", + "operationId": "get_pending_users_admin_pending_users_get", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/approve-user": { + "post": { + "summary": "Approve User", + "operationId": "approve_user_admin_approve_user_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserActionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/decline-user": { + "post": { + "summary": "Decline User", + "operationId": "decline_user_admin_decline_user_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserActionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/sessions": { + "get": { + "summary": "List Sessions", + "operationId": "list_sessions_sessions_get", + "parameters": [ + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + }, + { + "name": "min_csat", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Min Csat" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/sessions/{session_id}/messages": { + "get": { + "summary": "Get Session Messages", + "operationId": "get_session_messages_sessions__session_id__messages_get", + "parameters": [ + { + "name": "session_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Session Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Body_upload_document_kb_upload_post": { + "properties": { + "document_id": { + "type": "string", + "title": "Document Id" + }, + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "file": { + "type": "string", + "contentMediaType": "application/octet-stream", + "title": "File" + } + }, + "type": "object", + "required": [ + "document_id", + "tenant_id", + "file" + ], + "title": "Body_upload_document_kb_upload_post" + }, + "ChatQuery": { + "properties": { + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id" + }, + "question": { + "type": "string", + "title": "Question" + }, + "top_k": { + "type": "integer", + "title": "Top K", + "default": 5 + } + }, + "type": "object", + "required": [ + "tenant_id", + "question" + ], + "title": "ChatQuery" + }, + "ChatResponse": { + "properties": { + "session_id": { + "type": "string", + "title": "Session Id" + }, + "answer": { + "type": "string", + "title": "Answer" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/ChatSource" + }, + "type": "array", + "title": "Sources" + } + }, + "type": "object", + "required": [ + "session_id", + "answer", + "sources" + ], + "title": "ChatResponse" + }, + "ChatSource": { + "properties": { + "chunk_id": { + "type": "string", + "title": "Chunk Id" + }, + "relevance_score": { + "type": "number", + "title": "Relevance Score" + } + }, + "type": "object", + "required": [ + "chunk_id", + "relevance_score" + ], + "title": "ChatSource" + }, + "DocumentCreate": { + "properties": { + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "file_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Url" + }, + "format": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Format" + }, + "theme": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme" + } + }, + "type": "object", + "required": [ + "tenant_id" + ], + "title": "DocumentCreate" + }, + "DocumentUpdate": { + "properties": { + "file_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Url" + }, + "format": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Format" + }, + "theme": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "title": "DocumentUpdate" + }, + "EndChatRequest": { + "properties": { + "session_id": { + "type": "string", + "title": "Session Id" + }, + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "csat": { + "anyOf": [ + { + "type": "integer", + "maximum": 5.0, + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Csat" + } + }, + "type": "object", + "required": [ + "session_id", + "tenant_id" + ], + "title": "EndChatRequest" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "InviteAccept": { + "properties": { + "invite_token": { + "type": "string", + "title": "Invite Token" + }, + "user_id": { + "type": "string", + "title": "User Id" + }, + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": [ + "invite_token", + "user_id", + "email" + ], + "title": "InviteAccept" + }, + "TenantCreate": { + "properties": { + "owner_id": { + "type": "string", + "title": "Owner Id" + }, + "owner_email": { + "type": "string", + "title": "Owner Email" + }, + "company_name": { + "type": "string", + "title": "Company Name" + }, + "type_of_business": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type Of Business" + }, + "subscription_plan": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Subscription Plan" + }, + "bot_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Bot Name" + }, + "greeting_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Greeting Message" + }, + "theme_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme Color" + }, + "fallback_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Fallback Message" + } + }, + "type": "object", + "required": [ + "owner_id", + "owner_email", + "company_name" + ], + "title": "TenantCreate" + }, + "UserActionRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id" + } + }, + "type": "object", + "required": [ + "user_id" + ], + "title": "UserActionRequest" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "WebsiteDomainUpdate": { + "properties": { + "website_domain": { + "type": "string", + "title": "Website Domain" + } + }, + "type": "object", + "required": [ + "website_domain" + ], + "title": "WebsiteDomainUpdate" + } + } + } +} \ No newline at end of file From a70f125af64e0a106e8402b936851cdbee6a3b2a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 26 Sep 2026 16:41:54 +0000 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format=20and=20upda?= =?UTF-8?q?te=20with=20pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/core/config.py | 12 +- backend/contractguard/diff_agent.py | 6 +- .../reports/diff_report_endpoint_removed.json | 2 +- .../reports/diff_report_field_renamed.json | 2 +- .../reports/diff_report_type_changed.json | 2 +- backend/contractguard/reports/test_diff.json | 2 +- backend/openapi_snapshots/all/baseline.json | 2 +- .../all/drift_endpoint_removed.json | 2 +- .../all/drift_field_renamed.json | 2 +- .../all/drift_type_changed.json | 2 +- .../openapi_snapshots/diff_agent_base.json | 1237 ++++++++++++++++- 11 files changed, 1254 insertions(+), 17 deletions(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 163612f0db..7b58deb819 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -1,7 +1,6 @@ import warnings -from typing import Literal, Self - from pathlib import Path +from typing import Literal, Self from pydantic import ( EmailStr, @@ -16,11 +15,10 @@ class Settings(BaseSettings): model_config = SettingsConfigDict( - env_file=Path(__file__).resolve().parents[3] / ".env", - env_ignore_empty=True, - extra="ignore", -) - + env_file=Path(__file__).resolve().parents[3] / ".env", + env_ignore_empty=True, + extra="ignore", + ) API_V1_STR: str = "/api/v1" SECRET_KEY: str diff --git a/backend/contractguard/diff_agent.py b/backend/contractguard/diff_agent.py index 66cf7e02eb..95ef3777ca 100644 --- a/backend/contractguard/diff_agent.py +++ b/backend/contractguard/diff_agent.py @@ -177,7 +177,11 @@ def base_entry( ) for a in added: - changes.append(base_entry(key, "field_added_required", False, {}, {a: new_fields[a]}, "low")) + changes.append( + base_entry( + key, "field_added_required", False, {}, {a: new_fields[a]}, "low" + ) + ) for f in common: if old_fields[f] != new_fields[f]: diff --git a/backend/contractguard/reports/diff_report_endpoint_removed.json b/backend/contractguard/reports/diff_report_endpoint_removed.json index dec75d02a9..345f35871b 100644 --- a/backend/contractguard/reports/diff_report_endpoint_removed.json +++ b/backend/contractguard/reports/diff_report_endpoint_removed.json @@ -11,4 +11,4 @@ "severity": "high", "detected_at": "2026-09-26T12:35:38.858161+00:00" } -] \ No newline at end of file +] diff --git a/backend/contractguard/reports/diff_report_field_renamed.json b/backend/contractguard/reports/diff_report_field_renamed.json index 547c1b4b4c..cdf8d5a627 100644 --- a/backend/contractguard/reports/diff_report_field_renamed.json +++ b/backend/contractguard/reports/diff_report_field_renamed.json @@ -13,4 +13,4 @@ "severity": "high", "detected_at": "2026-09-26T12:32:56.064254+00:00" } -] \ No newline at end of file +] diff --git a/backend/contractguard/reports/diff_report_type_changed.json b/backend/contractguard/reports/diff_report_type_changed.json index ed94597725..c49cc0f0ce 100644 --- a/backend/contractguard/reports/diff_report_type_changed.json +++ b/backend/contractguard/reports/diff_report_type_changed.json @@ -13,4 +13,4 @@ "severity": "high", "detected_at": "2026-09-26T12:32:56.215675+00:00" } -] \ No newline at end of file +] diff --git a/backend/contractguard/reports/test_diff.json b/backend/contractguard/reports/test_diff.json index 0637a088a0..fe51488c70 100644 --- a/backend/contractguard/reports/test_diff.json +++ b/backend/contractguard/reports/test_diff.json @@ -1 +1 @@ -[] \ No newline at end of file +[] diff --git a/backend/openapi_snapshots/all/baseline.json b/backend/openapi_snapshots/all/baseline.json index 45bbe27dfd..de66347fd6 100644 --- a/backend/openapi_snapshots/all/baseline.json +++ b/backend/openapi_snapshots/all/baseline.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} diff --git a/backend/openapi_snapshots/all/drift_endpoint_removed.json b/backend/openapi_snapshots/all/drift_endpoint_removed.json index f96b4ac3c1..57ff4058dd 100644 --- a/backend/openapi_snapshots/all/drift_endpoint_removed.json +++ b/backend/openapi_snapshots/all/drift_endpoint_removed.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} diff --git a/backend/openapi_snapshots/all/drift_field_renamed.json b/backend/openapi_snapshots/all/drift_field_renamed.json index 234cff0fae..9dba356183 100644 --- a/backend/openapi_snapshots/all/drift_field_renamed.json +++ b/backend/openapi_snapshots/all/drift_field_renamed.json @@ -23,4 +23,4 @@ "sources" ], "title": "ChatResponse" -},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} diff --git a/backend/openapi_snapshots/all/drift_type_changed.json b/backend/openapi_snapshots/all/drift_type_changed.json index 2edf4ae975..c0c1279b0d 100644 --- a/backend/openapi_snapshots/all/drift_type_changed.json +++ b/backend/openapi_snapshots/all/drift_type_changed.json @@ -27,4 +27,4 @@ "question" ], "title": "ChatQuery" -},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} diff --git a/backend/openapi_snapshots/diff_agent_base.json b/backend/openapi_snapshots/diff_agent_base.json index 45bbe27dfd..928be74668 100644 --- a/backend/openapi_snapshots/diff_agent_base.json +++ b/backend/openapi_snapshots/diff_agent_base.json @@ -1 +1,1236 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/documents/{document_id}":{"get":{"summary":"Get Document","operationId":"get_document_documents__document_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Document","operationId":"update_document_documents__document_id__put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/documents":{"post":{"summary":"Create Document","operationId":"create_document_documents_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/db-check":{"get":{"summary":"Db Check","operationId":"db_check_db_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tenants/{tenant_id}/widget-config":{"get":{"summary":"Get Widget Config","operationId":"get_widget_config_tenants__tenant_id__widget_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants":{"post":{"summary":"Create Tenant","operationId":"create_tenant_tenants_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kb/upload":{"post":{"summary":"Upload Document","operationId":"upload_document_kb_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_kb_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Chat","operationId":"chat_chat_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/end":{"post":{"summary":"End Chat","operationId":"end_chat_chat_end_post","parameters":[{"name":"origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/website-domain":{"put":{"summary":"Update Website Domain","operationId":"update_website_domain_tenants_website_domain_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDomainUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invite/accept":{"post":{"summary":"Accept Invite","operationId":"accept_invite_invite_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pending-users":{"get":{"summary":"Get Pending Users","operationId":"get_pending_users_admin_pending_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/approve-user":{"post":{"summary":"Approve User","operationId":"approve_user_admin_approve_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/decline-user":{"post":{"summary":"Decline User","operationId":"decline_user_admin_decline_user_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_sessions_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"min_csat","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Csat"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/messages":{"get":{"summary":"Get Session Messages","operationId":"get_session_messages_sessions__session_id__messages_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_upload_document_kb_upload_post":{"properties":{"document_id":{"type":"string","title":"Document Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["document_id","tenant_id","file"],"title":"Body_upload_document_kb_upload_post"},"ChatQuery":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"question":{"type":"string","title":"Question"},"top_k":{"type":"integer","title":"Top K","default":5}},"type":"object","required":["tenant_id","question"],"title":"ChatQuery"},"ChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array","title":"Sources"}},"type":"object","required":["session_id","answer","sources"],"title":"ChatResponse"},"ChatSource":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"relevance_score":{"type":"number","title":"Relevance Score"}},"type":"object","required":["chunk_id","relevance_score"],"title":"ChatSource"},"DocumentCreate":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["tenant_id"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"DocumentUpdate"},"EndChatRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"csat":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Csat"}},"type":"object","required":["session_id","tenant_id"],"title":"EndChatRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteAccept":{"properties":{"invite_token":{"type":"string","title":"Invite Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["invite_token","user_id","email"],"title":"InviteAccept"},"TenantCreate":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"owner_email":{"type":"string","title":"Owner Email"},"company_name":{"type":"string","title":"Company Name"},"type_of_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Business"},"subscription_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Plan"},"bot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Name"},"greeting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Greeting Message"},"theme_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Color"},"fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Message"}},"type":"object","required":["owner_id","owner_email","company_name"],"title":"TenantCreate"},"UserActionRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"UserActionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDomainUpdate":{"properties":{"website_domain":{"type":"string","title":"Website Domain"}},"type":"object","required":["website_domain"],"title":"WebsiteDomainUpdate"}}}} \ No newline at end of file +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/": { + "get": { + "summary": "Read Root", + "operationId": "read_root__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/documents/{document_id}": { + "get": { + "summary": "Get Document", + "operationId": "get_document_documents__document_id__get", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "summary": "Update Document", + "operationId": "update_document_documents__document_id__put", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents": { + "post": { + "summary": "Create Document", + "operationId": "create_document_documents_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/db-check": { + "get": { + "summary": "Db Check", + "operationId": "db_check_db_check_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/tenants/{tenant_id}/widget-config": { + "get": { + "summary": "Get Widget Config", + "operationId": "get_widget_config_tenants__tenant_id__widget_config_get", + "parameters": [ + { + "name": "tenant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Tenant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tenants": { + "post": { + "summary": "Create Tenant", + "operationId": "create_tenant_tenants_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TenantCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/kb/upload": { + "post": { + "summary": "Upload Document", + "operationId": "upload_document_kb_upload_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_document_kb_upload_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/chat": { + "post": { + "summary": "Chat", + "operationId": "chat_chat_post", + "parameters": [ + { + "name": "origin", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Origin" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatQuery" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/chat/end": { + "post": { + "summary": "End Chat", + "operationId": "end_chat_chat_end_post", + "parameters": [ + { + "name": "origin", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Origin" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EndChatRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/tenants/website-domain": { + "put": { + "summary": "Update Website Domain", + "operationId": "update_website_domain_tenants_website_domain_put", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebsiteDomainUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/invite/accept": { + "post": { + "summary": "Accept Invite", + "operationId": "accept_invite_invite_accept_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InviteAccept" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/pending-users": { + "get": { + "summary": "Get Pending Users", + "operationId": "get_pending_users_admin_pending_users_get", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/approve-user": { + "post": { + "summary": "Approve User", + "operationId": "approve_user_admin_approve_user_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserActionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/decline-user": { + "post": { + "summary": "Decline User", + "operationId": "decline_user_admin_decline_user_post", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserActionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/sessions": { + "get": { + "summary": "List Sessions", + "operationId": "list_sessions_sessions_get", + "parameters": [ + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + }, + { + "name": "min_csat", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Min Csat" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/sessions/{session_id}/messages": { + "get": { + "summary": "Get Session Messages", + "operationId": "get_session_messages_sessions__session_id__messages_get", + "parameters": [ + { + "name": "session_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Session Id" + } + }, + { + "name": "authorization", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Authorization" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Body_upload_document_kb_upload_post": { + "properties": { + "document_id": { + "type": "string", + "title": "Document Id" + }, + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "file": { + "type": "string", + "contentMediaType": "application/octet-stream", + "title": "File" + } + }, + "type": "object", + "required": [ + "document_id", + "tenant_id", + "file" + ], + "title": "Body_upload_document_kb_upload_post" + }, + "ChatQuery": { + "properties": { + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id" + }, + "question": { + "type": "string", + "title": "Question" + }, + "top_k": { + "type": "integer", + "title": "Top K", + "default": 5 + } + }, + "type": "object", + "required": [ + "tenant_id", + "question" + ], + "title": "ChatQuery" + }, + "ChatResponse": { + "properties": { + "session_id": { + "type": "string", + "title": "Session Id" + }, + "answer": { + "type": "string", + "title": "Answer" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/ChatSource" + }, + "type": "array", + "title": "Sources" + } + }, + "type": "object", + "required": [ + "session_id", + "answer", + "sources" + ], + "title": "ChatResponse" + }, + "ChatSource": { + "properties": { + "chunk_id": { + "type": "string", + "title": "Chunk Id" + }, + "relevance_score": { + "type": "number", + "title": "Relevance Score" + } + }, + "type": "object", + "required": [ + "chunk_id", + "relevance_score" + ], + "title": "ChatSource" + }, + "DocumentCreate": { + "properties": { + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "file_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Url" + }, + "format": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Format" + }, + "theme": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme" + } + }, + "type": "object", + "required": [ + "tenant_id" + ], + "title": "DocumentCreate" + }, + "DocumentUpdate": { + "properties": { + "file_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Url" + }, + "format": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Format" + }, + "theme": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "title": "DocumentUpdate" + }, + "EndChatRequest": { + "properties": { + "session_id": { + "type": "string", + "title": "Session Id" + }, + "tenant_id": { + "type": "string", + "title": "Tenant Id" + }, + "csat": { + "anyOf": [ + { + "type": "integer", + "maximum": 5.0, + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Csat" + } + }, + "type": "object", + "required": [ + "session_id", + "tenant_id" + ], + "title": "EndChatRequest" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "InviteAccept": { + "properties": { + "invite_token": { + "type": "string", + "title": "Invite Token" + }, + "user_id": { + "type": "string", + "title": "User Id" + }, + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": [ + "invite_token", + "user_id", + "email" + ], + "title": "InviteAccept" + }, + "TenantCreate": { + "properties": { + "owner_id": { + "type": "string", + "title": "Owner Id" + }, + "owner_email": { + "type": "string", + "title": "Owner Email" + }, + "company_name": { + "type": "string", + "title": "Company Name" + }, + "type_of_business": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type Of Business" + }, + "subscription_plan": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Subscription Plan" + }, + "bot_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Bot Name" + }, + "greeting_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Greeting Message" + }, + "theme_color": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Theme Color" + }, + "fallback_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Fallback Message" + } + }, + "type": "object", + "required": [ + "owner_id", + "owner_email", + "company_name" + ], + "title": "TenantCreate" + }, + "UserActionRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id" + } + }, + "type": "object", + "required": [ + "user_id" + ], + "title": "UserActionRequest" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "WebsiteDomainUpdate": { + "properties": { + "website_domain": { + "type": "string", + "title": "Website Domain" + } + }, + "type": "object", + "required": [ + "website_domain" + ], + "title": "WebsiteDomainUpdate" + } + } + } +} From a6f2cfe472e2a8d3ff59510f9a15ab5c3d4c35eb Mon Sep 17 00:00:00 2001 From: mahigarg0403-blip Date: Sat, 26 Sep 2026 22:31:00 +0530 Subject: [PATCH 09/10] real diff output: 3 verified, correctly-classified drift reports --- .../reports/diff_report_endpoint_removed.json | 10 ++--- .../reports/diff_report_field_renamed.json | 38 ++++++++++++++++--- .../reports/diff_report_type_changed.json | 38 ++++++++++++++++--- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/backend/contractguard/reports/diff_report_endpoint_removed.json b/backend/contractguard/reports/diff_report_endpoint_removed.json index 345f35871b..c06cb6b7f1 100644 --- a/backend/contractguard/reports/diff_report_endpoint_removed.json +++ b/backend/contractguard/reports/diff_report_endpoint_removed.json @@ -1,14 +1,14 @@ [ { - "endpoint": "/health", - "method": "GET", + "endpoint": "/api/v1/items/{id}", + "method": "DELETE", "change_type": "endpoint_removed", "breaking": true, "old_schema_fragment": { - "$response": "unknown" + "message": "string" }, "new_schema_fragment": {}, "severity": "high", - "detected_at": "2026-09-26T12:35:38.858161+00:00" + "detected_at": "2026-09-26T17:00:02.339502+00:00" } -] +] \ No newline at end of file diff --git a/backend/contractguard/reports/diff_report_field_renamed.json b/backend/contractguard/reports/diff_report_field_renamed.json index cdf8d5a627..8695712e05 100644 --- a/backend/contractguard/reports/diff_report_field_renamed.json +++ b/backend/contractguard/reports/diff_report_field_renamed.json @@ -1,16 +1,44 @@ [ { - "endpoint": "/chat", + "endpoint": "/api/v1/items/", "method": "POST", "change_type": "field_renamed", "breaking": true, "old_schema_fragment": { - "answer": "string" + "title": "string" }, "new_schema_fragment": { - "response_text": "string" + "name": "string" }, "severity": "high", - "detected_at": "2026-09-26T12:32:56.064254+00:00" + "detected_at": "2026-09-26T16:59:46.473594+00:00" + }, + { + "endpoint": "/api/v1/items/{id}", + "method": "GET", + "change_type": "field_renamed", + "breaking": true, + "old_schema_fragment": { + "title": "string" + }, + "new_schema_fragment": { + "name": "string" + }, + "severity": "high", + "detected_at": "2026-09-26T16:59:46.473594+00:00" + }, + { + "endpoint": "/api/v1/items/{id}", + "method": "PUT", + "change_type": "field_renamed", + "breaking": true, + "old_schema_fragment": { + "title": "string" + }, + "new_schema_fragment": { + "name": "string" + }, + "severity": "high", + "detected_at": "2026-09-26T16:59:46.473594+00:00" } -] +] \ No newline at end of file diff --git a/backend/contractguard/reports/diff_report_type_changed.json b/backend/contractguard/reports/diff_report_type_changed.json index c49cc0f0ce..90b05c993a 100644 --- a/backend/contractguard/reports/diff_report_type_changed.json +++ b/backend/contractguard/reports/diff_report_type_changed.json @@ -1,16 +1,44 @@ [ { - "endpoint": "/chat", + "endpoint": "/api/v1/items/", "method": "POST", "change_type": "field_type_changed", "breaking": true, "old_schema_fragment": { - "top_k": "integer" + "description": "string" }, "new_schema_fragment": { - "top_k": "string" + "description": "array" }, "severity": "high", - "detected_at": "2026-09-26T12:32:56.215675+00:00" + "detected_at": "2026-09-26T17:00:00.789863+00:00" + }, + { + "endpoint": "/api/v1/items/{id}", + "method": "GET", + "change_type": "field_type_changed", + "breaking": true, + "old_schema_fragment": { + "description": "string" + }, + "new_schema_fragment": { + "description": "array" + }, + "severity": "high", + "detected_at": "2026-09-26T17:00:00.789863+00:00" + }, + { + "endpoint": "/api/v1/items/{id}", + "method": "PUT", + "change_type": "field_type_changed", + "breaking": true, + "old_schema_fragment": { + "description": "string" + }, + "new_schema_fragment": { + "description": "array" + }, + "severity": "high", + "detected_at": "2026-09-26T17:00:00.789863+00:00" } -] +] \ No newline at end of file From 3091db97d463b5fb1c8b43bb0143291487326a4e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 26 Sep 2026 17:02:16 +0000 Subject: [PATCH 10/10] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format=20and=20upda?= =?UTF-8?q?te=20with=20pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/contractguard/reports/diff_report_endpoint_removed.json | 2 +- backend/contractguard/reports/diff_report_field_renamed.json | 2 +- backend/contractguard/reports/diff_report_type_changed.json | 2 +- backend/openapi_snapshots/test_modified.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/contractguard/reports/diff_report_endpoint_removed.json b/backend/contractguard/reports/diff_report_endpoint_removed.json index c06cb6b7f1..48f37d0ab1 100644 --- a/backend/contractguard/reports/diff_report_endpoint_removed.json +++ b/backend/contractguard/reports/diff_report_endpoint_removed.json @@ -11,4 +11,4 @@ "severity": "high", "detected_at": "2026-09-26T17:00:02.339502+00:00" } -] \ No newline at end of file +] diff --git a/backend/contractguard/reports/diff_report_field_renamed.json b/backend/contractguard/reports/diff_report_field_renamed.json index 8695712e05..4a09f98d70 100644 --- a/backend/contractguard/reports/diff_report_field_renamed.json +++ b/backend/contractguard/reports/diff_report_field_renamed.json @@ -41,4 +41,4 @@ "severity": "high", "detected_at": "2026-09-26T16:59:46.473594+00:00" } -] \ No newline at end of file +] diff --git a/backend/contractguard/reports/diff_report_type_changed.json b/backend/contractguard/reports/diff_report_type_changed.json index 90b05c993a..3ae65b5305 100644 --- a/backend/contractguard/reports/diff_report_type_changed.json +++ b/backend/contractguard/reports/diff_report_type_changed.json @@ -41,4 +41,4 @@ "severity": "high", "detected_at": "2026-09-26T17:00:00.789863+00:00" } -] \ No newline at end of file +] diff --git a/backend/openapi_snapshots/test_modified.json b/backend/openapi_snapshots/test_modified.json index caa5a9ae99..928be74668 100644 --- a/backend/openapi_snapshots/test_modified.json +++ b/backend/openapi_snapshots/test_modified.json @@ -1233,4 +1233,4 @@ } } } -} \ No newline at end of file +}