-
Notifications
You must be signed in to change notification settings - Fork 219
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: AiAssistantModel #9494
base: feat/growi-ai-next
Are you sure you want to change the base?
feat: AiAssistantModel #9494
Changes from 8 commits
821203c
26713ca
9930e20
a8b3143
caf1db1
b52554d
6a505a4
b143f57
9167954
3fc841c
df996cb
c5c8529
9081d95
c0c9bc0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,132 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
import { type IGrantedGroup, GroupType } from '@growi/core'; | ||||||||||||||||||||||||||||||||||||||||||||||
import type mongoose from 'mongoose'; | ||||||||||||||||||||||||||||||||||||||||||||||
import { type Model, type Document, Schema } from 'mongoose'; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
import { getOrCreateModel } from '~/server/util/mongoose-utils'; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/* | ||||||||||||||||||||||||||||||||||||||||||||||
* Objects | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
const AiAssistantType = { | ||||||||||||||||||||||||||||||||||||||||||||||
KNOWLEDGE: 'knowledge', | ||||||||||||||||||||||||||||||||||||||||||||||
// EDITOR: 'editor', | ||||||||||||||||||||||||||||||||||||||||||||||
// LEARNING: 'learning', | ||||||||||||||||||||||||||||||||||||||||||||||
} as const; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const AiAssistantSharingScope = { | ||||||||||||||||||||||||||||||||||||||||||||||
PUBLIC: 'public', | ||||||||||||||||||||||||||||||||||||||||||||||
ONLY_ME: 'onlyMe', | ||||||||||||||||||||||||||||||||||||||||||||||
USER_GROUP: 'userGroup', | ||||||||||||||||||||||||||||||||||||||||||||||
} as const; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const AiAssistantLearningScope = { | ||||||||||||||||||||||||||||||||||||||||||||||
PUBLIC: 'public', | ||||||||||||||||||||||||||||||||||||||||||||||
ONLY_ME: 'onlyMe', | ||||||||||||||||||||||||||||||||||||||||||||||
USER_GROUP: 'userGroup', | ||||||||||||||||||||||||||||||||||||||||||||||
} as const; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/* | ||||||||||||||||||||||||||||||||||||||||||||||
* Interfaces | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
type AiAssistantType = typeof AiAssistantType[keyof typeof AiAssistantType]; | ||||||||||||||||||||||||||||||||||||||||||||||
type AiAssistantSharingScope = typeof AiAssistantSharingScope[keyof typeof AiAssistantSharingScope]; | ||||||||||||||||||||||||||||||||||||||||||||||
type AiAssistantLearningScope = typeof AiAssistantLearningScope[keyof typeof AiAssistantLearningScope]; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
interface AiAssistant { | ||||||||||||||||||||||||||||||||||||||||||||||
name: string; | ||||||||||||||||||||||||||||||||||||||||||||||
description?: string | ||||||||||||||||||||||||||||||||||||||||||||||
instruction?: string | ||||||||||||||||||||||||||||||||||||||||||||||
vectorStoreId: string // VectorStoreId of OpenAI Specify (https://platform.openai.com/docs/api-reference/vector-stores/object) | ||||||||||||||||||||||||||||||||||||||||||||||
types: AiAssistantType[] | ||||||||||||||||||||||||||||||||||||||||||||||
grantedGroups: IGrantedGroup[]; | ||||||||||||||||||||||||||||||||||||||||||||||
pages: mongoose.Types.ObjectId[] | ||||||||||||||||||||||||||||||||||||||||||||||
sharingScope: AiAssistantSharingScope | ||||||||||||||||||||||||||||||||||||||||||||||
learningScope: AiAssistantLearningScope | ||||||||||||||||||||||||||||||||||||||||||||||
isDeleted: boolean | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
interface AiAssistantDocument extends AiAssistant, Document {} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
type AiAssistantModel = Model<AiAssistantDocument> | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
/* | ||||||||||||||||||||||||||||||||||||||||||||||
* Schema Definition | ||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||
const schema = new Schema<AiAssistantDocument>( | ||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||
name: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
description: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
instruction: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
vectorStoreId: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. VectorStore model を踏襲 growi/apps/app/src/features/openai/server/models/vector-store.ts Lines 25 to 29 in df996cb
|
||||||||||||||||||||||||||||||||||||||||||||||
types: [{ | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
enum: Object.values(AiAssistantType), | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}], | ||||||||||||||||||||||||||||||||||||||||||||||
pages: [{ | ||||||||||||||||||||||||||||||||||||||||||||||
type: Schema.Types.ObjectId, | ||||||||||||||||||||||||||||||||||||||||||||||
ref: 'Page', | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}], | ||||||||||||||||||||||||||||||||||||||||||||||
grantedGroups: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: [{ | ||||||||||||||||||||||||||||||||||||||||||||||
type: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
enum: Object.values(GroupType), | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
default: 'UserGroup', | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
item: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: Schema.Types.ObjectId, | ||||||||||||||||||||||||||||||||||||||||||||||
refPath: 'grantedGroups.type', | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
index: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
}], | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Page mode を踏襲 growi/apps/app/src/server/models/page.ts Lines 137 to 158 in df996cb
|
||||||||||||||||||||||||||||||||||||||||||||||
validate: [function(arr: IGrantedGroup[]): boolean { | ||||||||||||||||||||||||||||||||||||||||||||||
if (arr == null) return true; | ||||||||||||||||||||||||||||||||||||||||||||||
const uniqueItemValues = new Set(arr.map(e => e.item)); | ||||||||||||||||||||||||||||||||||||||||||||||
return arr.length === uniqueItemValues.size; | ||||||||||||||||||||||||||||||||||||||||||||||
}, 'grantedGroups contains non unique item'], | ||||||||||||||||||||||||||||||||||||||||||||||
default: [], | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
sharingScope: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
enum: Object.values(AiAssistantSharingScope), | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 共有範囲 |
||||||||||||||||||||||||||||||||||||||||||||||
learningScope: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: String, | ||||||||||||||||||||||||||||||||||||||||||||||
enum: Object.values(AiAssistantLearningScope), | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 名前変えたほうがいいかも。e-learning のためのフィールドと勘違いする。 あとこれは enum だけではなく UserGroup への参照が必要なのではないか? |
||||||||||||||||||||||||||||||||||||||||||||||
isDeleted: { | ||||||||||||||||||||||||||||||||||||||||||||||
type: Boolean, | ||||||||||||||||||||||||||||||||||||||||||||||
default: false, | ||||||||||||||||||||||||||||||||||||||||||||||
required: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. VectorStore model を踏襲 growi/apps/app/src/features/openai/server/models/vector-store.ts Lines 35 to 39 in df996cb
|
||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||
timestamps: true, | ||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
schema.methods.markAsDeleted = async function(): Promise<void> { | ||||||||||||||||||||||||||||||||||||||||||||||
this.isDeleted = true; | ||||||||||||||||||||||||||||||||||||||||||||||
await this.save(); | ||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. VectorStore model 踏襲 growi/apps/app/src/features/openai/server/models/vector-store.ts Lines 42 to 45 in df996cb
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
export default getOrCreateModel<AiAssistantDocument, AiAssistantModel>('AiAssistant', schema); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
特化型アシスタントになったことで、実際使う時の instruction はシステム側で入れると思うんだよね
ナレッジアシスタントとかエディタアシスタントのそれぞれの役割になるように
ユーザーが指定できるのはサブの instruction になるので、additionalInstruction にしておいた方がいいかも
あと description も instruction も not optional でいいと思う。初期値は空文字列にすればいいので。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
修正済み