Skip to content

Commit 42d4ff6

Browse files
authored
Merge pull request #42 from meta-d/develop
Version 2.5.1
2 parents e415624 + 626926f commit 42d4ff6

File tree

51 files changed

+407
-329
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+407
-329
lines changed

.deploy/api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ocap-server",
33
"author": "Metad",
4-
"version": "2.5.0",
4+
"version": "2.5.1",
55
"scripts": {
66
"start": "nx serve",
77
"build": "nx build",

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,23 @@ English | [中文](./README_zh.md)
3030
# Metad Analytics Platform
3131

3232
## 💡 What's New
33+
### ChatBI: Natural Language-Driven Business Intelligence Analysis
3334

35+
[ChatBI](https://mtda.cloud/en/docs/chatbi) is an innovative feature we are introducing, combining chat functionality with business intelligence (BI) analysis capabilities. It offers users a more intuitive and convenient data analysis experience through natural language interaction. The main features of ChatBI include:
36+
37+
1. **Natural Language Querying**: Users can ask questions in natural language and get data analysis results directly without needing to understand complex query languages. This feature allows even non-technical personnel to easily obtain data insights.
38+
39+
2. **Multi-Turn Conversations**: Supports multi-turn conversations, allowing for continuous, context-aware interactions. The system remembers previous conversation content, enabling deeper and more precise data analysis.
40+
41+
3. **Support for Various Large Language Models**: ChatBI integrates multiple mainstream large language models, such as ChatGPT and Llama, enhancing the accuracy of natural language understanding and generation to meet different business needs and language support.
42+
4. **Security and Access Control**: Provides strict data security and access control to ensure the protection of sensitive data.
43+
5. **Integration with Multiple Data Sources**: Supports connection and integration with data from various sources, such as databases, cloud services, and SAP ERP systems, providing users with rich data sources.
44+
45+
[More details](https://mtda.cloud/en/blog/releases-2-5-chatbi/)
46+
47+
[ChatBI_Demo.mp4](https://github.com/user-attachments/assets/5f7c84be-2307-43cf-8342-bce39524e37d)
48+
49+
### Copilot Command Agents
3450
🎉🎉 New version brings several exciting new features, particularly a comprehensive upgrade to [Copilot Command](https://www.mtda.cloud/en/docs/server/copilot/#commands) and [Business Roles](https://www.mtda.cloud/en/docs/server/copilot/#business-roles).
3551

3652
- [New Version 2.4 - Copilot Multi-Agent Command](https://www.mtda.cloud/en/blog/releases-2-4-copilot-multi-agent).

README_zh.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@
1212

1313
## 💡 新功能
1414

15+
### ChatBI:自然语言驱动的商业智能分析
16+
17+
[ChatBI](https://mtda.cloud/docs/chatbi) 是我们新推出的一个创新功能,它将聊天功能与商业智能(BI)分析能力相结合,通过自然语言交互的方式,为用户提供更加直观和便捷的数据分析体验。以下是 ChatBI 的主要特点:
18+
1. **自然语言查询 (Natural Language Querying)**:用户可以使用自然语言提问,直接获取数据分析结果,无需掌握复杂的查询语言。这一功能让即便是非技术人员,也能轻松获取数据洞察。
19+
2. **多轮对话 (Multi-Turn Conversations)**:支持多轮对话功能,允许用户进行连续的、上下文相关的交互。系统能够记住前面的对话内容,使数据分析更加深入和精准。
20+
3. **支持各种大语言模型 (Various Large Language Models)**:ChatBI 集成了多种主流大语言模型,如 ChatGPT 和 Llama,提升了自然语言理解和生成的准确性,满足不同业务需求和语言支持。
21+
4. **安全与权限管理 (Security and Access Control)**:提供严格的数据安全和权限管理,确保敏感数据的保护。
22+
5. **集成多数据源 (Integration with Multiple Data Sources)**:支持连接和集成来自不同来源的数据,如数据库、云端服务、SAP ERP 系统等,为用户提供丰富的数据来源。
23+
24+
[更多详情](https://mtda.cloud/blog/releases-2-5-chatbi)
25+
26+
[ChatBI_Demo.mp4](https://github.com/user-attachments/assets/5f7c84be-2307-43cf-8342-bce39524e37d)
27+
28+
### 副驾命令智能体
29+
1530
🎉🎉 新版本带来了一些令人兴奋的新功能,特别是对 [Copilot Command](https://www.mtda.cloud/docs/server/copilot/#命令)[Business Roles](https://www.mtda.cloud/docs/server/copilot/#业务角色) 的全面升级。
1631

1732
- [新版本 2.4 - 副驾多智能体命令](https://www.mtda.cloud/blog/releases-2-4-copilot-multi-agent/)

apps/cloud/src/app/features/chatbi/chatbi.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ export class ChatbiService {
267267
}
268268

269269
updateQuestionAnswer(key: string, answer: QuestionAnswer) {
270-
this._updateConversation(this.conversationKey(), (state) => {
270+
this.updateConversation((state) => {
271271
const index = state.messages.findIndex((message) => message.id === key)
272272
if (index > -1) {
273273
state.messages[index] = {

apps/cloud/src/app/features/chatbi/home.component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { nonBlank, provideOcapCore } from '@metad/ocap-angular/core'
1010
import { DisplayBehaviour } from '@metad/ocap-core'
1111
import { StoryExplorerModule } from '@metad/story'
1212
import { TranslateModule } from '@ngx-translate/core'
13+
import { NGXLogger } from 'ngx-logger'
1314
import { injectQueryParams } from 'ngxtension/inject-query-params'
1415
import { filter, map, switchMap } from 'rxjs'
1516
import { ChatBIConversationService, routeAnimations } from '../../@core'
@@ -49,6 +50,7 @@ export class ChatbiHomeComponent {
4950
readonly conversationService = inject(ChatBIConversationService)
5051
readonly router = inject(Router)
5152
readonly route = inject(ActivatedRoute)
53+
readonly logger = inject(NGXLogger)
5254
readonly conversationId = injectQueryParams('id')
5355

5456
readonly modelId = model<string>(null)
@@ -127,13 +129,13 @@ export class ChatbiHomeComponent {
127129
}
128130

129131
async openExplore(message: CopilotChatMessage, answer: QuestionAnswer) {
130-
console.log(answer)
132+
this.logger.debug('openExplorer', answer)
131133
this.showExplorer.set(true)
132-
this.explore.set({ ...answer, key: message.id })
134+
this.explore.set({ ...structuredClone(answer), key: message.id })
133135
}
134136

135137
closeExplorer(event?: QuestionAnswer) {
136-
console.log(event)
138+
this.logger.debug('closeExplorer', event)
137139
this.showExplorer.set(false)
138140
if (event) {
139141
this.chatbiService.updateQuestionAnswer(this.explore().key, event)

apps/cloud/src/app/features/chatbi/input/input.component.html

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,21 @@
8585
</div>
8686

8787
<ng-template #menu>
88-
<div class="example-menu" cdkMenu>
88+
<div class="ngm-chatbi__conversations-menu" cdkMenu>
8989
@for (item of conversations(); track item.key) {
9090
<button
9191
cdkMenuItemCheckbox
92-
class="example-menu-item w-full"
92+
class="ngm-chatbi__conversations-menu-item w-full"
9393
[cdkMenuItemChecked]="item.key === conversation()?.key"
9494
(click)="setConversation(item.key)"
9595
>
96-
<div class="flex justify-start items-center text-left min-w-[100px]">
96+
<div class="flex justify-start items-center text-left min-w-[100px] max-w-[600px] overflow-hidden text-ellipsis">
9797
@if (conversations().length > 1) {
98-
<mat-icon class="cursor-pointer rounded-full hover:bg-neutral-300" ngmAppearance="danger" displayDensity="compact"
98+
<mat-icon class="cursor-pointer mr-2 rounded-full hover:bg-neutral-300 dark:hover:bg-neutral-600" ngmAppearance="danger" displayDensity="cosy"
9999
(click)="deleteConversation(item.key)">close</mat-icon>
100100
}
101-
<span class="flex-1 text-ellipsis overflow-hidden">{{item.name || ('PAC.ChatBI.Empty' | translate: {Default: 'Empty'}) }}</span>
101+
<span class="flex-1 text-ellipsis overflow-hidden"
102+
[title]="item.name">{{item.name || ('PAC.ChatBI.Empty' | translate: {Default: 'Empty'}) }}</span>
102103
</div>
103104
</button>
104105
}

apps/cloud/src/app/features/chatbi/input/input.component.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,17 @@
44
.ngm-colpilot__input.disabled {
55
@apply opacity-50;
66
}
7+
8+
.ngm-chatbi__conversations-menu {
9+
.ngm-chatbi__conversations-menu-item {
10+
&[role='menuitemradio'][aria-checked='true'] {
11+
@apply bg-zinc-200 dark:bg-zinc-600;
12+
}
13+
&[role='menuitemcheckbox'][aria-checked='true'] {
14+
@apply bg-zinc-200 dark:bg-zinc-600;
15+
}
16+
&:active {
17+
@apply bg-zinc-400 dark:bg-zinc-500;
18+
}
19+
}
20+
}

apps/cloud/src/app/features/project/project.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Injectable, computed, effect, inject, signal } from '@angular/core'
1+
import { Injectable, computed, inject, signal } from '@angular/core'
22
import { toObservable, toSignal } from '@angular/core/rxjs-interop'
33
import {
44
BusinessAreasService,
@@ -11,7 +11,7 @@ import {
1111
import { dirtyCheckWith, nonBlank } from '@metad/core'
1212
import { NgmDSCoreService } from '@metad/ocap-angular/core'
1313
import { WasmAgentService } from '@metad/ocap-angular/wasm-agent'
14-
import { MDCube, isEntitySet, isEqual, negate } from '@metad/ocap-core'
14+
import { MDCube, isEntitySet, isEqual, negate, nonNullable } from '@metad/ocap-core'
1515
import { Store, createStore, withProps } from '@ngneat/elf'
1616
import { stateHistory } from '@ngneat/elf-state-history'
1717
import { cloneDeep } from 'lodash-es'
@@ -69,6 +69,7 @@ export class ProjectService {
6969
readonly modelDetails = signal<Record<string, ISemanticModel>>({})
7070

7171
readonly modelCubes$ = this.models$.pipe(
72+
filter(nonNullable),
7273
tap(async (models) => {
7374
for await (const model of models) {
7475
await this.registerModel(model.key)

apps/cloud/src/app/features/project/project/project.component.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ export class ProjectComponent extends TranslationBaseComponent {
9999

100100
readonly projectService = inject(ProjectService)
101101
readonly collectionService = inject(CollectionService)
102-
// readonly copilotContext = inject(NgmCopilotContextToken)
103102
readonly dsCoreService = inject(NgmDSCoreService)
104103
readonly wasmAgent = inject(WasmAgentService)
105104
readonly appService = inject(AppService)

apps/cloud/src/app/features/semantic-model/model/members/cube/cube.component.ts

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ export class ModelMembersCubeComponent {
107107

108108
async refresh() {
109109
const cube = this.cube().name
110-
// const dimensions = this.dimensions()
111110

112111
this.loading.set(true)
113112
if (this.entity()?.id) {
@@ -117,27 +116,25 @@ export class ModelMembersCubeComponent {
117116

118117
if (this.selectedDims()) {
119118
for (const name of this.selectedDims()) {
120-
// storeMembers[name] = []
121-
122119
let storeMembers = []
123120
const hierarchy = getEntityHierarchy(this.cube().entityType, name)
124-
// const dimension = dimensions.find((dim) => dim.name === name)
125-
// for (const hierarchy of dimension.hierarchies) {
126-
const members = await tryHttp(
127-
this.modelService.selectHierarchyMembers(cube, { dimension: hierarchy.dimension, hierarchy: hierarchy.name }),
128-
this.toastrService
129-
)
130-
if (members) {
131-
storeMembers = storeMembers.concat(members)
132-
}
133-
// }
121+
if (!hierarchy) {
122+
this.toastrService.error('PAC.MODEL.CanntFoundHierarchy', null, {Default: `Can't found hierarchy '${name}'`, value: name})
123+
} else {
124+
const members = await tryHttp(
125+
this.modelService.selectHierarchyMembers(cube, { dimension: hierarchy.dimension, hierarchy: hierarchy.name }),
126+
this.toastrService
127+
)
128+
if (members) {
129+
storeMembers = storeMembers.concat(members)
130+
}
134131

135-
this.members.update((members) => ({
136-
...members,
137-
[name]: storeMembers
138-
}))
132+
this.members.update((members) => ({
133+
...members,
134+
[name]: storeMembers
135+
}))
136+
}
139137
}
140-
141138
this.loaded.set(true)
142139
}
143140

0 commit comments

Comments
 (0)