Files
meeting-room/backend/instances/migrations/0001_initial.py
flying-hero 929459fd33 🔔 飞行侠实现:实例注册 + Webhook 推送
新功能:
- instances 应用:OpenClaw 实例管理
- Instance 模型:实例注册,Agent 列表,Webhook URL
- MeetingInstanceMap:会议 - 实例映射
- Webhook 推送:消息发送时自动通知相关实例

API 端点:
- POST /api/v1/instances/register/ - 实例注册
- POST /api/v1/instances/join-meeting/ - 加入会议
- GET  /api/v1/instances/ - 实例列表
- POST /api/v1/instances/webhook-test/ - Webhook 测试

集成:
- send_message API 自动触发 Webhook 推送
- 支持广播和定向推送

测试:
- test_webhook.py: 完整测试流程

使用场景:
1. 每台 OpenClaw 机器注册实例
2. Agent 加入会议时关联实例
3. 消息发送时推送到对应机器
4. 本机 OpenClaw 收到通知,触发 Agent 响应
2026-04-04 12:19:43 +08:00

111 lines
3.7 KiB
Python

# Generated by Django 6.0.3 on 2026-04-04 04:02
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="Instance",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
(
"instance_id",
models.CharField(
max_length=100, unique=True, verbose_name="实例 ID"
),
),
(
"instance_name",
models.CharField(max_length=200, verbose_name="实例名称"),
),
(
"agent_ids",
models.JSONField(default=list, verbose_name="Agent ID 列表"),
),
(
"webhook_url",
models.URLField(
help_text="消息推送地址", verbose_name="Webhook URL"
),
),
(
"webhook_enabled",
models.BooleanField(default=True, verbose_name="启用 Webhook"),
),
(
"is_active",
models.BooleanField(default=True, verbose_name="是否活跃"),
),
(
"last_heartbeat",
models.DateTimeField(
blank=True, null=True, verbose_name="最后心跳"
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
],
options={
"verbose_name": "OpenClaw 实例",
"verbose_name_plural": "OpenClaw 实例",
"db_table": "instances",
"ordering": ["-created_at"],
},
),
migrations.CreateModel(
name="MeetingInstanceMap",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("meeting_id", models.UUIDField(verbose_name="会议 ID")),
(
"agent_ids",
models.JSONField(default=list, verbose_name="参与的 Agent ID 列表"),
),
("joined_at", models.DateTimeField(auto_now_add=True)),
("left_at", models.DateTimeField(blank=True, null=True)),
(
"instance",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="meetings",
to="instances.instance",
),
),
],
options={
"db_table": "meeting_instance_maps",
"indexes": [
models.Index(
fields=["meeting_id", "left_at"],
name="meeting_ins_meeting_947179_idx",
)
],
"unique_together": {("meeting_id", "instance")},
},
),
]