ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: OpenAI pipeline и voice sessions

This commit is contained in:
DCCONSTRUCTIONS
2026-04-24 17:53:26 +03:00
parent 3c19c3175f
commit 1a20e19a93
7 changed files with 823 additions and 33 deletions
@@ -0,0 +1,142 @@
# Generated by Codex on 2026-04-24
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("db", "0124_workspace_ai_settings_and_credentials"),
]
operations = [
migrations.CreateModel(
name="VoiceTaskSession",
fields=[
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="Created At"),
),
(
"updated_at",
models.DateTimeField(auto_now=True, verbose_name="Last Modified At"),
),
("deleted_at", models.DateTimeField(blank=True, null=True, verbose_name="Deleted At")),
(
"id",
models.UUIDField(
db_index=True,
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
unique=True,
),
),
(
"status",
models.CharField(
choices=[
("uploaded", "Uploaded"),
("transcribing", "Transcribing"),
("transcribed", "Transcribed"),
("parsing", "Parsing"),
("parsed", "Parsed"),
("failed", "Failed"),
],
default="uploaded",
max_length=32,
),
),
("audio_duration_seconds", models.FloatField(blank=True, null=True)),
("audio_content_type", models.CharField(blank=True, max_length=100)),
("audio_size", models.PositiveIntegerField(blank=True, null=True)),
("transcript", models.TextField(blank=True)),
("intent", models.CharField(blank=True, max_length=40)),
("parsed_json", models.JSONField(blank=True, default=dict)),
("client_context", models.JSONField(blank=True, default=dict)),
("error_code", models.CharField(blank=True, max_length=80)),
("error_message", models.TextField(blank=True)),
(
"created_by",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_created_by",
to=settings.AUTH_USER_MODEL,
verbose_name="Created By",
),
),
(
"created_task",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="created_by_voice_sessions",
to="db.issue",
),
),
(
"updated_by",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_updated_by",
to=settings.AUTH_USER_MODEL,
verbose_name="Last Modified By",
),
),
(
"updated_task",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="updated_by_voice_sessions",
to="db.issue",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="voice_task_sessions",
to=settings.AUTH_USER_MODEL,
),
),
(
"workspace",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="voice_task_sessions",
to="db.workspace",
),
),
],
options={
"verbose_name": "Voice Task Session",
"verbose_name_plural": "Voice Task Sessions",
"db_table": "voice_task_sessions",
"ordering": ("-created_at",),
},
),
migrations.AddIndex(
model_name="voicetasksession",
index=models.Index(
fields=["workspace", "user", "-created_at"],
name="voice_task_session_user_idx",
),
),
migrations.AddIndex(
model_name="voicetasksession",
index=models.Index(
fields=["workspace", "status", "-created_at"],
name="voice_task_session_status_idx",
),
),
]
@@ -65,7 +65,7 @@ from .state import State, StateGroup, DEFAULT_STATES
from .user import Account, Profile, User, BotTypeEnum
from .view import IssueView
from .webhook import Webhook, WebhookLog
from .voice_tasker import WorkspaceAICredential, WorkspaceAISettings
from .voice_tasker import VoiceTaskSession, WorkspaceAICredential, WorkspaceAISettings
from .workspace import (
Workspace,
WorkspaceBaseModel,
@@ -2,6 +2,7 @@
# SPDX-License-Identifier: AGPL-3.0-only
# See the LICENSE file for details.
from django.conf import settings
from django.db import models
from .base import BaseModel
@@ -72,3 +73,61 @@ class WorkspaceAICredential(BaseModel):
def __str__(self):
return f"{self.workspace.slug} {self.provider} credential"
class VoiceTaskSession(BaseModel):
class Status(models.TextChoices):
UPLOADED = "uploaded", "Uploaded"
TRANSCRIBING = "transcribing", "Transcribing"
TRANSCRIBED = "transcribed", "Transcribed"
PARSING = "parsing", "Parsing"
PARSED = "parsed", "Parsed"
FAILED = "failed", "Failed"
workspace = models.ForeignKey(
"db.Workspace",
on_delete=models.CASCADE,
related_name="voice_task_sessions",
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="voice_task_sessions",
)
status = models.CharField(max_length=32, choices=Status.choices, default=Status.UPLOADED)
audio_duration_seconds = models.FloatField(null=True, blank=True)
audio_content_type = models.CharField(max_length=100, blank=True)
audio_size = models.PositiveIntegerField(null=True, blank=True)
transcript = models.TextField(blank=True)
intent = models.CharField(max_length=40, blank=True)
parsed_json = models.JSONField(blank=True, default=dict)
client_context = models.JSONField(blank=True, default=dict)
created_task = models.ForeignKey(
"db.Issue",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="created_by_voice_sessions",
)
updated_task = models.ForeignKey(
"db.Issue",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="updated_by_voice_sessions",
)
error_code = models.CharField(max_length=80, blank=True)
error_message = models.TextField(blank=True)
class Meta:
verbose_name = "Voice Task Session"
verbose_name_plural = "Voice Task Sessions"
db_table = "voice_task_sessions"
ordering = ("-created_at",)
indexes = [
models.Index(fields=["workspace", "user", "-created_at"], name="voice_task_session_user_idx"),
models.Index(fields=["workspace", "status", "-created_at"], name="voice_task_session_status_idx"),
]
def __str__(self):
return f"{self.workspace_id} {self.user_id} {self.status}"