### What Changed?
- Add `PerplexityProvider` in backend.
- Update session prompt name if user toggle network search mode in chat panel.
- Add experimental flag for AI network search feature.
- Add unit tests and e2e tests.
Search results are streamed and appear word for word:
<div class='graphite__hidden'>
<div>🎥 Video uploaded on Graphite:</div>
<a href="https://app.graphite.dev/media/video/sJGviKxfE3Ap685cl5bj/56f6ec7b-4b21-405f-9612-43e083f6fb84.mov">
<img src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/sJGviKxfE3Ap685cl5bj/56f6ec7b-4b21-405f-9612-43e083f6fb84.mov">
</a>
</div>
<video src="https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/sJGviKxfE3Ap685cl5bj/56f6ec7b-4b21-405f-9612-43e083f6fb84.mov">录屏2024-12-27 18.58.40.mov</video>
Click the little globe icon to manually turn on/off Internet search:
<div class='graphite__hidden'>
<div>🎥 Video uploaded on Graphite:</div>
<a href="https://app.graphite.dev/media/video/sJGviKxfE3Ap685cl5bj/778f1406-bf29-498e-a90d-7dad813392d1.mov">
<img src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/sJGviKxfE3Ap685cl5bj/778f1406-bf29-498e-a90d-7dad813392d1.mov">
</a>
</div>
<video src="https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/sJGviKxfE3Ap685cl5bj/778f1406-bf29-498e-a90d-7dad813392d1.mov">录屏2024-12-27 19.01.16.mov</video>
When there is an image, it will automatically switch to the openai model:
<div class='graphite__hidden'>
<div>🎥 Video uploaded on Graphite:</div>
<a href="https://app.graphite.dev/media/video/sJGviKxfE3Ap685cl5bj/56431d8e-75e1-4d84-ab4a-b6636042cc6a.mov">
<img src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/sJGviKxfE3Ap685cl5bj/56431d8e-75e1-4d84-ab4a-b6636042cc6a.mov">
</a>
</div>
<video src="https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/sJGviKxfE3Ap685cl5bj/56431d8e-75e1-4d84-ab4a-b6636042cc6a.mov">录屏2024-12-27 19.02.13.mov</video>
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
import './config';
|
|
|
|
import { ServerFeature } from '../../core/config';
|
|
import { FeatureModule } from '../../core/features';
|
|
import { PermissionModule } from '../../core/permission';
|
|
import { QuotaModule } from '../../core/quota';
|
|
import { Plugin } from '../registry';
|
|
import { CopilotController } from './controller';
|
|
import { ChatMessageCache } from './message';
|
|
import { PromptService } from './prompt';
|
|
import {
|
|
assertProvidersConfigs,
|
|
CopilotProviderService,
|
|
FalProvider,
|
|
OpenAIProvider,
|
|
PerplexityProvider,
|
|
registerCopilotProvider,
|
|
} from './providers';
|
|
import {
|
|
CopilotResolver,
|
|
PromptsManagementResolver,
|
|
UserCopilotResolver,
|
|
} from './resolver';
|
|
import { ChatSessionService } from './session';
|
|
import { CopilotStorage } from './storage';
|
|
import { CopilotWorkflowExecutors, CopilotWorkflowService } from './workflow';
|
|
|
|
registerCopilotProvider(FalProvider);
|
|
registerCopilotProvider(OpenAIProvider);
|
|
registerCopilotProvider(PerplexityProvider);
|
|
|
|
@Plugin({
|
|
name: 'copilot',
|
|
imports: [FeatureModule, QuotaModule, PermissionModule],
|
|
providers: [
|
|
ChatSessionService,
|
|
CopilotResolver,
|
|
ChatMessageCache,
|
|
UserCopilotResolver,
|
|
PromptService,
|
|
CopilotProviderService,
|
|
CopilotStorage,
|
|
PromptsManagementResolver,
|
|
CopilotWorkflowService,
|
|
...CopilotWorkflowExecutors,
|
|
],
|
|
controllers: [CopilotController],
|
|
contributesTo: ServerFeature.Copilot,
|
|
if: config => {
|
|
if (config.flavor.graphql) {
|
|
return assertProvidersConfigs(config);
|
|
}
|
|
return false;
|
|
},
|
|
})
|
|
export class CopilotModule {}
|