-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathschema.sql
168 lines (150 loc) · 6.32 KB
/
schema.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
-- Enable pgvector extension
-- -- Drop existing tables and extensions
-- DROP EXTENSION IF EXISTS vector CASCADE;
-- DROP TABLE IF EXISTS relationships CASCADE;
-- DROP TABLE IF EXISTS participants CASCADE;
-- DROP TABLE IF EXISTS logs CASCADE;
-- DROP TABLE IF EXISTS goals CASCADE;
-- DROP TABLE IF EXISTS memories CASCADE;
-- DROP TABLE IF EXISTS rooms CASCADE;
-- DROP TABLE IF EXISTS accounts CASCADE;
-- DROP TABLE IF EXISTS knowledge CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
-- Create a function to determine vector dimension
CREATE OR REPLACE FUNCTION get_embedding_dimension()
RETURNS INTEGER AS $$
BEGIN
-- Check for OpenAI first
IF current_setting('app.use_openai_embedding', TRUE) = 'true' THEN
RETURN 1536; -- OpenAI dimension
-- Then check for Ollama
ELSIF current_setting('app.use_ollama_embedding', TRUE) = 'true' THEN
RETURN 1024; -- Ollama mxbai-embed-large dimension
-- Then check for GAIANET
ELSIF current_setting('app.use_gaianet_embedding', TRUE) = 'true' THEN
RETURN 768; -- Gaianet nomic-embed dimension
ELSE
RETURN 384; -- BGE/Other embedding dimension
END IF;
END;
$$ LANGUAGE plpgsql;
BEGIN;
CREATE TABLE IF NOT EXISTS accounts (
"id" UUID PRIMARY KEY,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"name" TEXT,
"username" TEXT,
"email" TEXT NOT NULL,
"avatarUrl" TEXT,
"details" JSONB DEFAULT '{}'::jsonb
);
CREATE TABLE IF NOT EXISTS rooms (
"id" UUID PRIMARY KEY,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
DO $$
DECLARE
vector_dim INTEGER;
BEGIN
vector_dim := get_embedding_dimension();
EXECUTE format('
CREATE TABLE IF NOT EXISTS memories (
"id" UUID PRIMARY KEY,
"type" TEXT NOT NULL,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"content" JSONB NOT NULL,
"embedding" vector(%s),
"userId" UUID REFERENCES accounts("id"),
"agentId" UUID REFERENCES accounts("id"),
"roomId" UUID REFERENCES rooms("id"),
"unique" BOOLEAN DEFAULT true NOT NULL,
CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE,
CONSTRAINT fk_agent FOREIGN KEY ("agentId") REFERENCES accounts("id") ON DELETE CASCADE
)', vector_dim);
END $$;
CREATE TABLE IF NOT EXISTS goals (
"id" UUID PRIMARY KEY,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"userId" UUID REFERENCES accounts("id"),
"name" TEXT,
"status" TEXT,
"description" TEXT,
"roomId" UUID REFERENCES rooms("id"),
"objectives" JSONB DEFAULT '[]'::jsonb NOT NULL,
CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS logs (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"userId" UUID NOT NULL REFERENCES accounts("id"),
"body" JSONB NOT NULL,
"type" TEXT NOT NULL,
"roomId" UUID NOT NULL REFERENCES rooms("id"),
CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS participants (
"id" UUID PRIMARY KEY,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"userId" UUID REFERENCES accounts("id"),
"roomId" UUID REFERENCES rooms("id"),
"userState" TEXT,
"last_message_read" TEXT,
UNIQUE("userId", "roomId"),
CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS relationships (
"id" UUID PRIMARY KEY,
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"userA" UUID NOT NULL REFERENCES accounts("id"),
"userB" UUID NOT NULL REFERENCES accounts("id"),
"status" TEXT,
"userId" UUID NOT NULL REFERENCES accounts("id"),
CONSTRAINT fk_user_a FOREIGN KEY ("userA") REFERENCES accounts("id") ON DELETE CASCADE,
CONSTRAINT fk_user_b FOREIGN KEY ("userB") REFERENCES accounts("id") ON DELETE CASCADE,
CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS cache (
"key" TEXT NOT NULL,
"agentId" TEXT NOT NULL,
"value" JSONB DEFAULT '{}'::jsonb,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"expiresAt" TIMESTAMP,
PRIMARY KEY ("key", "agentId")
);
DO $$
DECLARE
vector_dim INTEGER;
BEGIN
vector_dim := get_embedding_dimension();
EXECUTE format('
CREATE TABLE IF NOT EXISTS knowledge (
"id" UUID PRIMARY KEY,
"agentId" UUID REFERENCES accounts("id"),
"content" JSONB NOT NULL,
"embedding" vector(%s),
"createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
"isMain" BOOLEAN DEFAULT FALSE,
"originalId" UUID REFERENCES knowledge("id"),
"chunkIndex" INTEGER,
"isShared" BOOLEAN DEFAULT FALSE,
CHECK(("isShared" = true AND "agentId" IS NULL) OR ("isShared" = false AND "agentId" IS NOT NULL))
)', vector_dim);
END $$;
-- Indexes
CREATE INDEX IF NOT EXISTS idx_memories_embedding ON memories USING hnsw ("embedding" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS idx_memories_type_room ON memories("type", "roomId");
CREATE INDEX IF NOT EXISTS idx_participants_user ON participants("userId");
CREATE INDEX IF NOT EXISTS idx_participants_room ON participants("roomId");
CREATE INDEX IF NOT EXISTS idx_relationships_users ON relationships("userA", "userB");
CREATE INDEX IF NOT EXISTS idx_knowledge_agent ON knowledge("agentId");
CREATE INDEX IF NOT EXISTS idx_knowledge_agent_main ON knowledge("agentId", "isMain");
CREATE INDEX IF NOT EXISTS idx_knowledge_original ON knowledge("originalId");
CREATE INDEX IF NOT EXISTS idx_knowledge_created ON knowledge("agentId", "createdAt");
CREATE INDEX IF NOT EXISTS idx_knowledge_shared ON knowledge("isShared");
CREATE INDEX IF NOT EXISTS idx_knowledge_embedding ON knowledge USING ivfflat (embedding vector_cosine_ops);
COMMIT;