-
-
Notifications
You must be signed in to change notification settings - Fork 13.6k
✨ feat: LobeChat OpenAPI #8642
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
base: main
Are you sure you want to change the base?
✨ feat: LobeChat OpenAPI #8642
Conversation
Someone is attempting to deploy a commit to the LobeHub OSS Team on Vercel. A member of the Team first needs to authorize it. |
Reviewer's GuideThis PR introduces a full OpenAPI v1 interface built on Hono.js under ER diagram for expanded database relations (messages, users, sessions, files, AI infra)erDiagram
USERS ||--o{ SESSIONS : "has"
USERS ||--o{ AI_PROVIDERS : "has"
USERS ||--o{ AI_MODELS : "has"
SESSIONS ||--o{ MESSAGES : "has"
SESSIONS ||--o{ FILES_TO_SESSIONS : "has"
SESSIONS }o--|| SESSION_GROUPS : "belongs to"
SESSIONS }o--|| USERS : "belongs to"
MESSAGES ||--o{ MESSAGES_FILES : "has"
MESSAGES }o--|| SESSIONS : "belongs to"
MESSAGES }o--|| USERS : "belongs to"
MESSAGES }o--|| THREADS : "belongs to"
MESSAGES }o--|| MESSAGE_TRANSLATES : "has translation"
MESSAGES }o--|| MESSAGE_TTS : "has tts"
MESSAGES_FILES }o--|| FILES : "file"
MESSAGES_FILES }o--|| MESSAGES : "message"
AI_PROVIDERS ||--o{ AI_MODELS : "has"
AI_PROVIDERS }o--|| USERS : "belongs to"
AI_MODELS }o--|| AI_PROVIDERS : "provider"
AI_MODELS }o--|| USERS : "belongs to"
FILES_TO_SESSIONS }o--|| FILES : "file"
FILES_TO_SESSIONS }o--|| SESSIONS : "session"
MESSAGE_TRANSLATES }o--|| MESSAGES : "message"
MESSAGE_TTS }o--|| MESSAGES : "message"
Class diagram for new and updated backend service classes (AgentService, SessionService, FileUploadService)classDiagram
class BaseService {
<<abstract>>
+db: LobeChatDatabase
+userId: string
+resolveQueryPermission()
+createAuthError()
+createAuthorizationError()
+log()
}
class AgentService {
+getAllAgents()
+createAgent()
+updateAgent()
+deleteAgent()
+getAgentById()
+getAgentBySessionId()
+migrateAgentSessions()
+createSessionForAgent()
+getAgentSessions()
+linkAgentSession()
+unlinkAgentSession()
+batchLinkAgentSessions()
+batchDeleteAgents()
+batchUpdateAgents()
}
class SessionService {
+getSessions()
+getGroupedSessions()
+getSessionsGroupedByAgent()
+getSessionCountGroupedByAgent()
+getSessionById()
+getSessionConfig()
+createSession()
+updateSession()
+deleteSession()
+cloneSession()
+searchSessions()
+batchGetSessions()
+batchUpdateSessions()
}
class FileUploadService {
+uploadFile()
+uploadFiles()
+createPreSignedUrl()
+getFileList()
+getFileDetail()
+getFileUrl()
+uploadPublicFile()
+getPermanentFileUrl()
+parseFile()
+deleteFile()
+getFileAndParse()
+uploadAndParseFile()
+createFileSessionRelation()
+batchGetFiles()
}
AgentService --|> BaseService
SessionService --|> BaseService
FileUploadService --|> BaseService
Class diagram for updated message types (MessageItem, MessageTranslateItem)classDiagram
class MessageItem {
+createdAt: Date
+error: any | null
+favorite: boolean | null
+files: string[] | null
+id: string
+metadata?: MessageMetadata | null
+model: string | null
...
}
class MessageTranslateItem {
...
}
File-Level Changes
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There is too much information in the pull request to test. |
Thank you for raising your pull request and contributing to our Community |
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.
Hey @MarioJames - I've reviewed your changes and found some issues that need to be addressed.
Blocking issues:
- SQL injection risk in LIKE clause for keyword search. (link)
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location> `src/database/schemas/relations.ts:114` </location>
<code_context>
references: [threads.id],
}),
+
+ translation: one(messageTranslates, {
+ fields: [messages.id],
+ references: [messageTranslates.id],
+ }),
+
+ tts: one(messageTTS, {
</code_context>
<issue_to_address>
The translation and tts relations use messages.id as the foreign key, which may not match the referenced table's primary key.
Verify that messageTranslates.id and messageTTS.id are meant to match messages.id. If they have independent primary keys, this setup could cause incorrect joins and break referential integrity.
</issue_to_address>
### Comment 2
<location> `src/database/schemas/relations.ts:292` </location>
<code_context>
+ }),
+}));
+
+export const aiModelsRelations = relations(aiModels, ({ one }) => ({
+ provider: one(aiProviders, {
+ fields: [aiModels.providerId, aiModels.userId],
+ references: [aiProviders.id, aiProviders.userId],
+ }),
+ user: one(users, {
+ fields: [aiModels.userId],
+ references: [users.id],
+ }),
+}));
// Generation 相关关系定义
export const generationTopicsRelations = relations(generationTopics, ({ one, many }) => ({
</code_context>
<issue_to_address>
aiModelsRelations references both providerId and userId for the provider relation, which may not match the referenced table's primary key.
Please verify that aiProviders has a composite primary key (id, userId) to match this relation. Otherwise, this setup may cause join issues.
</issue_to_address>
### Comment 3
<location> `src/database/models/document.ts:55` </location>
<code_context>
.where(and(eq(documents.id, id), eq(documents.userId, this.userId)));
};
+
+ findByFileId = async (fileId: string) => {
+ return this.db.query.documents.findFirst({
+ where: and(eq(documents.fileId, fileId), eq(documents.userId, this.userId)),
+ });
+ };
}
</code_context>
<issue_to_address>
findByFileId method assumes that fileId is unique per user, which may not be enforced at the database level.
If fileId is not unique per user, this method may return an unintended document. Please ensure uniqueness or document the intended behavior.
</issue_to_address>
<suggested_fix>
<<<<<<< SEARCH
findByFileId = async (fileId: string) => {
return this.db.query.documents.findFirst({
where: and(eq(documents.fileId, fileId), eq(documents.userId, this.userId)),
});
};
=======
/**
* Finds a document by fileId for the current user.
*
* Note: This method assumes that fileId is unique per user.
* If multiple documents exist with the same fileId for a user,
* this will return the first match found. Ensure uniqueness at the
* database level or handle accordingly.
*/
findByFileId = async (fileId: string) => {
return this.db.query.documents.findFirst({
where: and(eq(documents.fileId, fileId), eq(documents.userId, this.userId)),
});
};
>>>>>>> REPLACE
</suggested_fix>
### Comment 4
<location> `src/app/(backend)/api/v1/_hono/services/topic.service.ts:47` </location>
<code_context>
+ whereConditions.push(eq(topics.userId, permissionResult.condition.userId));
+ }
+
+ // 如果有关键词,添加标题的模糊搜索条件
+ if (keyword) {
+ whereConditions.push(sql`${topics.title} LIKE ${`%${keyword}%`}`);
</code_context>
<issue_to_address>
SQL injection risk in LIKE clause for keyword search.
Use parameterized queries or ORM ilike/like functions to prevent SQL injection when handling user input in SQL statements.
</issue_to_address>
### Comment 5
<location> `src/app/(backend)/api/v1/_hono/controllers/session.controller.ts:141` </location>
<code_context>
+ const { id: sessionId } = this.getParams<{ id: string }>(c);
+ const body = await this.getBody<Omit<UpdateSessionRequest, 'id'>>(c);
+
+ console.log('body', body);
+
+ const request: UpdateSessionRequest = {
</code_context>
<issue_to_address>
Remove console.log statement from production code.
Console.log statements can clutter production logs and potentially expose sensitive information. Please remove or use a proper logging mechanism if necessary.
</issue_to_address>
<suggested_fix>
<<<<<<< SEARCH
console.log('body', body);
const request: UpdateSessionRequest = {
=======
const request: UpdateSessionRequest = {
>>>>>>> REPLACE
</suggested_fix>
### Comment 6
<location> `src/app/(backend)/api/v1/_hono/helpers/file.ts:23` </location>
<code_context>
+
+ return {
+ ...file,
+ url: `${publicDomain}/${file.url}`,
+ };
+}
</code_context>
<issue_to_address>
Adding a slash between publicDomain and file.url may result in double slashes if publicDomain ends with a slash.
Normalize slashes to prevent double slashes in the URL when concatenating publicDomain and file.url.
</issue_to_address>
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
src/app/(backend)/api/v1/_hono/controllers/session.controller.ts
Outdated
Show resolved
Hide resolved
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.
revert
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.
revert
12c8cfc
to
4557391
Compare
6f75b9c
to
d8299b3
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8642 +/- ##
==========================================
+ Coverage 79.75% 79.79% +0.04%
==========================================
Files 822 255 -567
Lines 53140 15178 -37962
Branches 7118 2895 -4223
==========================================
- Hits 42381 12112 -30269
+ Misses 10759 3066 -7693
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
aa26902
to
75f9b8f
Compare
- 在SessionController中新增获取按Agent分组的会话数量接口 /api/v1/sessions/grouped-by-agent - 更新SessionService以支持按Agent分组的会话数量查询 - 修改相关请求和响应类型定义,确保与新接口一致性 - 优化数据库查询,提升性能 🤖 Generated with [Claude Code](https://claude.ai/code)
- 在FileController中新增获取文件访问URL接口 /files/:id/url 和获取文件永久访问URL接口 /files/:id/permanent-url - 实现公共文件上传接口 /files/upload-public,支持文件上传并返回永久可访问的URL - 更新FileUploadService以支持文件URL生成和公共文件上传逻辑 - 添加相关请求和响应类型定义,确保与新接口一致性 - 优化数据库查询,提升性能 🤖 Generated with [Claude Code](https://claude.ai/code)
- 在 BatchUpdateSessionsRequest 接口中添加 userId 字段,以支持用户信息的传递 - 确保与现有接口的一致性,提升批量更新会话的灵活性 🤖 Generated with [Claude Code](https://claude.ai/code)
- 在 sessions.route.ts 中新增批量更新会话的 PUT 接口 /api/v1/sessions/batch-update,支持会话更新权限验证 - 在 session.service.ts 中修正会话查询逻辑,确保批量更新操作的正确性 - 在 session.type.ts 中为 BatchUpdateSessionsRequestSchema 添加可选的 userId 字段,以支持用户信息的传递
- 在 session.controller.ts 中新增日志输出,便于调试更新会话请求的 body 内容 - 在 user.controller.ts 中修改用户搜索接口,支持分页功能,允许传入 pageSize 参数 - 在 user.service.ts 中优化用户搜索逻辑,处理空关键词时返回用户列表,并限制返回数量 - 在 session.type.ts 和 user.type.ts 中更新请求和响应类型定义,确保与新功能一致性 此更新提升了会话更新的可调试性,并增强了用户搜索的灵活性和性能。
- 在 session.controller.ts 中简化会话查询逻辑,移除不必要的权限检查,直接使用请求参数。 - 在 sessions.route.ts 中重新实现批量查询会话的 POST 接口,确保权限验证和请求体的正确性。 - 在 session.service.ts 中调整会话查询条件,移除 userId 的处理,优化查询逻辑。 - 在 session.type.ts 中移除 GetSessionsRequest 接口中的 userId 字段,确保请求类型与新逻辑一致。 此更新提升了会话查询的简洁性和性能,确保了接口的一致性和可维护性。
- 在 session.ts 中优化 update 方法,移除 userId 的条件,确保更新逻辑更加简洁。 - 此更新提升了会话更新的可读性和性能,确保了代码的一致性和可维护性。
- 在RBAC权限定义中新增了消息翻译相关的权限操作,包括创建、读取和更新翻译信息。 - 新增了消息翻译控制器,处理获取、翻译和更新消息翻译信息的请求。 - 更新了路由配置,整合消息翻译相关的路由,确保与新控制器的连接。 - 新增消息翻译服务,封装翻译逻辑和数据库操作,提升代码的可维护性和可读性。 - 更新了类型定义,确保消息翻译请求和响应的类型一致性。 此更改旨在增强系统的消息翻译能力,提供更好的用户体验和功能扩展性。
- 更新了消息控制器,统一了消息数量统计和消息列表查询接口,简化了参数处理逻辑,提升了代码的可读性和一致性。 - 修改了路由配置,调整了消息数量统计和消息列表的请求方式,确保符合RESTful API设计规范。 - 更新了类型定义,确保消息查询参数的类型一致性,支持更灵活的查询条件。 此更改旨在增强消息处理功能的灵活性和可维护性,同时优化API的使用体验。
- 更新了角色控制器,合并了获取所有角色和获取活跃角色的逻辑,简化了接口调用,提升了代码的可读性和一致性。 - 修改了角色服务,新增了基于查询参数的获取角色方法,增强了角色查询的灵活性。 - 更新了路由配置,调整了角色相关的API文档,确保符合RESTful API设计规范。 此更改旨在优化角色管理功能,提升系统的可维护性和用户体验。
- 重构了模型控制器,合并了获取模型列表和获取模型配置的逻辑,简化了接口调用,提升了代码的可读性和一致性。 - 修改了模型服务,新增了基于查询参数的获取模型配置方法,增强了模型配置查询的灵活性。 - 更新了路由配置,调整了模型相关的API文档,确保符合RESTful API设计规范。 此更改旨在优化模型管理功能,提升系统的可维护性和用户体验。
- 移除了不再使用的更新会话组排序和删除所有会话组的功能,简化了控制器的代码结构。 - 更新了权限校验逻辑,使用 `getAllScopePermissions` 替代 `getScopePermissions`,确保权限检查更加一致和简洁。 - 修改了会话组服务中的查询逻辑,增强了权限校验,确保用户只能访问其有权查看的会话组。 此更改旨在提升会话组管理功能的可维护性和一致性,同时优化权限管理逻辑。
- 新增 `session-group.type.ts` 文件,定义会话组相关的请求和响应类型,提升类型一致性和可读性。 - 更新 `base.service.ts` 中的权限校验逻辑,添加 `condition` 字段以返回用户ID信息,增强权限校验的透明度。 - 修改多个文件中的导入路径,从 `session.type` 更新为 `session-group.type`,确保代码结构的清晰和一致性。 此更改旨在优化会话组管理功能的类型定义和权限校验逻辑,提升系统的可维护性和用户体验。
- 移除了不再使用的获取会话详情、分组会话列表和按Agent分组的会话数量的功能,简化了控制器的代码结构。 - 更新了会话控制器的路由,统一了会话列表的获取接口,支持分组和搜索功能,提升了API的一致性。 - 修改了会话服务中的查询逻辑,增强了权限校验,确保用户只能访问其有权查看的会话。 - 更新了类型定义,确保会话请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在优化会话管理功能,提升系统的可维护性和用户体验。
- 统一了获取话题列表的接口,支持通过查询参数进行会话过滤,提升了API的一致性和灵活性。 - 修改了话题服务中的查询逻辑,增强了权限校验,确保用户只能访问其有权查看的话题。 - 更新了类型定义,确保话题请求和响应的类型一致性,支持更灵活的查询条件。 - 移除了不再使用的接口,简化了控制器的代码结构。 此更改旨在优化话题管理功能,提升系统的可维护性和用户体验。
- 修改了用户控制器,统一了获取用户列表的接口,支持通过查询参数进行搜索和分页,提升了API的一致性和灵活性。 - 更新了用户服务中的查询逻辑,增强了权限校验,确保用户只能访问其有权查看的用户信息。 - 移除了不再使用的搜索用户功能,简化了控制器的代码结构。 - 更新了类型定义,确保用户请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在优化用户管理功能,提升系统的可维护性和用户体验。
- 修改了用户服务中的查询逻辑,统一了获取用户列表的接口,支持通过查询参数进行搜索和分页,提升了API的一致性和灵活性。 - 更新了会话和话题服务中的查询逻辑,增强了权限校验,确保用户只能访问其有权查看的会话和话题信息。 - 移除了不再使用的接口,简化了控制器的代码结构,提升了可维护性。 - 更新了多个类型定义,确保请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在优化用户、会话和话题管理功能,提升系统的可维护性和用户体验。
- 在 `base.controller.ts` 中引入 `parseFormData` 函数,替代原有的 `formData()` 方法,以增强对 multipart/form-data 的解析能力。 - 在 `file.service.ts` 中新增 `ensureFullUrl` 和 `convertToUploadResponse` 方法,确保文件URL的完整性并优化上传响应格式。 - 更新 `message.service.ts` 中的消息格式化逻辑,使用新的文件服务方法来处理文件URL,提升消息内容的格式化一致性。 - 移除不再使用的 `transformMessageToResponse` 函数,简化代码结构,提升可维护性。 - 更新多个类型定义,确保文件和消息相关的请求和响应类型一致性,支持更灵活的查询条件。 此更改旨在优化文件处理和消息服务的逻辑,提升系统的可维护性和用户体验。
- 在 `package.json` 中新增 `@aws-sdk/client-bedrock-runtime` 依赖,以支持最新的 AWS SDK 功能。 - 移除 `packages/model-runtime/package.json` 中的 `@aws-sdk/client-bedrock-runtime` 依赖,确保依赖的一致性。 - 删除 `packages/openapi/src/types/ai-infra.type.ts` 文件,清理无用的类型定义文件。 此更改旨在优化项目依赖管理,提升代码的整洁性和可维护性。
- 在 `rbac.ts` 中重构权限定义,移除冗余权限项,新增翻译相关权限。 - 在 `message-translations.controller.ts` 中新增删除翻译信息的接口。 - 在 `role.controller.ts` 和 `user.controller.ts` 中新增清空角色和用户角色的接口。 - 更新 `role.service.ts` 和 `user.service.ts` 中的角色和用户角色清空逻辑,增强权限校验。 - 在 `rbac.ts` 中引入 `getAllowedScopesForAction` 函数,优化权限范围获取逻辑。 此更改旨在提升 RBAC 系统的可维护性和翻译功能的灵活性,确保权限管理更加清晰和一致。
- 将 `getAllAgents` 和 `getUsers` 方法重命名为 `queryAgents` 和 `queryUsers`,以更好地反映其功能。 - 在 `AgentService` 和 `UserService` 中实现分页查询逻辑,支持通过查询参数进行搜索和分页,提升了 API 的一致性和灵活性。 - 新增 `processPaginationConditions` 函数以处理分页查询参数,确保查询的灵活性和可维护性。 - 更新多个类型定义,确保请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在优化 Agent 和用户管理功能,提升系统的可维护性和用户体验。
- 将 `getSessions` 方法重命名为 `querySessions`,以更好地反映其功能,并更新相关的请求类型。 - 在 `SessionService` 中实现了新的 `querySessions` 方法,支持通过关键字进行模糊搜索,并增强了分页查询的逻辑。 - 更新了批量更新会话的接口,简化了请求体结构,确保与新的请求类型一致。 - 新增了对会话组 ID 的验证逻辑,确保在批量更新时会话组的有效性。 此更改旨在提升会话管理功能的灵活性和一致性,优化系统的可维护性和用户体验。
- 将 `getTopicsBySessionId` 方法重命名为 `getTopics`,以更好地反映其功能,并更新相关的请求类型。 - 在 `TopicService` 中实现了分页查询逻辑,支持通过查询参数进行搜索和分页,提升了 API 的一致性和灵活性。 - 新增 `IPaginationQuery` 接口和 `PaginationQuerySchema`,以处理通用的分页查询参数,确保查询的灵活性和可维护性。 - 更新多个类型定义,确保请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在优化话题管理功能,提升系统的可维护性和用户体验。
- 在 `message.controller.ts` 中新增了 `handleDeleteMessage` 和 `handleDeleteBatchMessages` 方法,分别处理单个消息和批量消息的删除请求。 - 在 `message.service.ts` 中实现了 `deleteMessage` 和 `deleteBatchMessages` 方法,支持消息的单独和批量删除,并添加了权限校验逻辑。 - 更新了 `message.route.ts`,为删除消息的接口添加了相应的路由和权限验证。 - 修改了 `message.type.ts`,新增了 `MessagesDeleteBatchRequest` 类型以支持批量删除请求的结构。 此更改旨在增强消息管理功能,提升系统的灵活性和用户体验。
- 在 `rbac.ts` 中新增了 `AI_MODEL_INVOKE` 权限,以支持模型调用的权限管理。 - 更新了 `model.controller.ts` 和 `model.service.ts`,将模型列表查询参数改为使用 `IPaginationQuery`,增强了查询的灵活性。 - 在 `chat.service.ts` 中重构了翻译和生成回复的方法,使用新的权限检查逻辑,确保用户在调用模型时具备相应权限。 - 更新了多个类型定义,确保请求和响应的类型一致性,支持更灵活的查询条件。 此更改旨在提升模型和聊天服务的权限管理和查询能力,优化系统的可维护性和用户体验。
- 将文件上传和批量获取文件详情的接口进行了重命名和整合,提升了API的一致性。 - 移除了不再使用的上传和解析文件的逻辑,简化了文件服务的实现。 - 更新了文件类型定义,确保请求和响应的类型一致性,支持更灵活的查询条件。 - 新增了权限验证逻辑,确保用户在进行文件操作时具备相应权限。 此更改旨在优化文件管理功能,提升系统的可维护性和用户体验。
- 在 `provider.controller.ts` 中,创建 Provider 时新增 `source` 字段,确保数据来源的明确性。 - 在 `provider.service.ts` 中,重构 `transformProviderRecord` 方法,优化数据转换逻辑,确保返回的 `ProviderDetailResponse` 类型一致性。 - 更新多个类型定义,移除不再使用的字段,简化请求和响应结构,提升代码可读性和维护性。 此更改旨在优化 Provider 管理功能,提升系统的可维护性和用户体验。
- 新增 `permission.controller.ts` 和 `permission.service.ts`,实现权限的增删改查功能,支持获取权限列表、权限详情、创建新权限、更新权限和删除权限。 - 更新 `index.ts` 和 `services/index.ts`,将权限控制器和服务导出,以便于模块化管理。 - 在 `role.controller.ts` 和 `role.service.ts` 中,更新角色相关逻辑以支持权限的管理和操作。 - 更新多个类型定义,确保请求和响应的类型一致性,支持更灵活的权限查询条件。 此更改旨在优化权限管理功能,提升系统的可维护性和用户体验。
- 在 `permission.service.ts` 中,重构 `getPermissions` 方法,新增分页查询逻辑,支持通过查询参数进行搜索和分页,提升了 API 的一致性和灵活性。 - 更新返回类型为 `PermissionsListResponse`,确保返回的权限列表和总数结构一致。 - 在 `permission.type.ts` 中,扩展 `PermissionsListQuery` 类型以包含分页查询参数,确保请求和响应的类型一致性。 此更改旨在优化权限管理功能,提升系统的可维护性和用户体验。
- 在 `model.controller.ts` 中新增了 `handleCreateModel` 和 `handleUpdateModel` 方法,分别处理模型的创建和更新请求,并更新了获取模型详情的接口。 - 在 `models.route.ts` 中添加了相应的路由,支持创建、更新和获取模型的操作,确保权限验证逻辑的完整性。 - 在 `model.service.ts` 中实现了 `createModel` 和 `updateModel` 方法,处理模型的创建和更新逻辑,确保数据的一致性和完整性。 - 更新了 `model.type.ts`,引入新的请求体类型以支持模型的创建和更新。 此更改旨在增强模型管理功能,提升系统的灵活性和用户体验。
0445fee
to
a087681
Compare
- 在 中将国际化部分标题更改为 ,并更新了翻译文件的路径说明,确保文档的准确性和一致性。 - 在 中移除了不再使用的 依赖,并更新了 和 的版本,确保依赖项的最新性和兼容性。 - 在 的 中新增了 依赖,以支持新的功能需求。 - 更新了多个文件中的导入路径,确保模块引用的一致性和正确性。 此更改旨在提升项目的可维护性和用户体验,确保依赖项和文档的准确性。refactor: 更新 CLAUDE.md 和 package.json 以优化国际化和依赖管理 - 在 中将国际化部分标题更改为 ,并更新了翻译文件的路径说明,确保文档的准确性和清晰性。 - 在 中移除了不再使用的 依赖,并更新了 和 的版本,确保依赖的最新性和一致性。 - 在 的 中新增了 依赖,以支持新的功能需求。 - 在 中更新了 接口,移除了不必要的字段,提升了类型的一致性和简洁性。 - 在 中移除了 字段,简化了 接口,优化了消息类型的结构。 此更改旨在提升代码的可维护性和用户体验,确保系统的灵活性和一致性。
- 在 中新增了 作为依赖,以增强文件上传的处理能力。 - 在 中更新了文件处理逻辑,使用 解析 multipart/form-data 请求,提升了文件上传的稳定性和兼容性。 - 在 中重构了 方法,优先使用 进行文件解析,确保更好的性能和错误处理。 - 更新了多个参数的处理逻辑,确保在缺失时返回 null,提升了代码的健壮性。 此更改旨在优化文件上传功能,提升系统的用户体验和可维护性。
💻 变更类型 | Change Type
🔀 变更说明 | Description of Change
新增 OpenAPI v1 版本接口
架构设计
在 LobeChat 中继承轻量化框架 Hono
通过在 api/v1 下创建拦截式路由实现请求的接收,目录结构如下
|── v1
│ |── [[...route]] // 拦截路由,将请求拦截后转发到 _hono 的总入口
│ |── _hono // hono 应用
│ |── app.ts // 总入口
│ |── common // 公共库,存放一些基类
│ |── constant // 常量
│ |── controllers // controller
│ |── helpers // 工具函数
│ |── middleware // 中间件,登录态、rbac 权限管理等
│ |── routes // 路由注册
│ |── services // service
│ |── types // 类型定义
如何新增一个模块
routes
目录下新增一个路由文件,在routes/index.ts
中注册该路由文件controllers
下新增一个控制器文件,继承common/base.controller.ts
,提供了基础的数据库实例注入、请求参数转换、操作请求响应等能力services
下新增相应的服务文件,继承common/base.service.ts
,提供了统一的日志、rbac 细粒度权限管理、各种类型的抛错等能力如何调用
可以通过 Postman/Apifox 等工具通过调用
/api/v1/
相关接口实现调用开发自测
为了方便在本地测试接口,提供了新的环境变量:
MOCK_DEV_USER_ID
.env
文件中配置MOCK_DEV_USER_ID
为特定的用户lobe-auth-dev-backend-api: 1
middleware/auth
中间件会自动放行,并将userId
放到相应的上下文中鉴权逻辑
目前仅支持通过 OIDC JWT Token 的鉴权方式,用户可以将第三方客户端接入 LobeChat 提供的标准化 OIDC Provider
通过获取到授权方的 IdToken 信息,在调用接口时,通过
Authorization: Bearer {id_token}
的方式传递中间件会对请求合法性进行校验 通过后会将对应的用户信息注入到请求上下文中
📝 补充信息 | Additional Information
在接口中因为涉及到一些联表查询,因此在
src/database/schemas/relations.ts
中添加了所需的关联关系维护Summary by Sourcery
Add OpenAPI v1 endpoints using Hono to expose a fully featured backend API with authentication and RBAC, extend database schema, and enhance file, session, agent, user, message, topic, model, chat, and search services
New Features:
Enhancements:
Build:
Documentation: