@ -130,7 +130,7 @@ PreConfigure<AbpAIWorkspaceOptions>(options =>
#### Dynamic Workspaces
#### Dynamic Workspaces
* **Created through the UI** or programmatically via `IWorkspaceRepository`
* **Created through the UI** or programmatically via `ApplicationWorkspaceManager` and ` IWorkspaceRepository`
* **Fully manageable** - can be created, updated, activated/deactivated, and deleted
* **Fully manageable** - can be created, updated, activated/deactivated, and deleted
* **Stored in database** with all configuration
* **Stored in database** with all configuration
* **Ideal for** user-customizable AI features
* **Ideal for** user-customizable AI features
@ -138,15 +138,30 @@ PreConfigure<AbpAIWorkspaceOptions>(options =>
Example (data seeding):
Example (data seeding):
```csharp
```csharp
var workspace = new Workspace(
public class WorkspaceDataSeederContributor : IDataSeedContributor, ITransientDependency
name: "CustomerSupportWorkspace",
{
provider: "OpenAI",
private readonly IWorkspaceRepository _workspaceRepository;
modelName: "gpt-4",
private readonly ApplicationWorkspaceManager _applicationWorkspaceManager;
apiKey: "your-api-key"
public WorkspaceDataSeederContributor(
);
IWorkspaceRepository workspaceRepository,
workspace.ApplicationName = ApplicationInfoAccessor.ApplicationName;
ApplicationWorkspaceManager applicationWorkspaceManager)
workspace.SystemPrompt = "You are a helpful customer support assistant.";
{
await _workspaceRepository.InsertAsync(workspace);
_workspaceRepository = workspaceRepository;
_applicationWorkspaceManager = applicationWorkspaceManager;
}
public async Task SeedAsync(DataSeedContext context)
{
var workspace = await _applicationWorkspaceManager.CreateAsync(
name: "CustomerSupportWorkspace",
provider: "OpenAI",
modelName: "gpt-4");
workspace.ApiKey = "your-api-key";
workspace.SystemPrompt = "You are a helpful customer support assistant.";
await _workspaceRepository.InsertAsync(workspace);
}
```
```
### Workspace Naming Rules
### Workspace Naming Rules
@ -172,12 +187,13 @@ The AI Management module defines the following permissions:
In addition to module-level permissions, you can restrict access to individual workspaces by setting the `RequiredPermissionName` property:
In addition to module-level permissions, you can restrict access to individual workspaces by setting the `RequiredPermissionName` property:
```csharp
```csharp
var workspace = new Workspace (
var workspace = await _applicationWorkspaceManager.CreateAsync (
name: "PremiumWorkspace",
name: "PremiumWorkspace",
provider: "OpenAI",
provider: "OpenAI",
modelName: "gpt-4",
modelName: "gpt-4"
requiredPermissionName: "MyApp.PremiumFeatures"
);
);
// Set a specific permission for the workspace
workspace.RequiredPermissionName = MyAppPermissions.AccessPremiumWorkspaces;
```
```
When a workspace has a required permission:
When a workspace has a required permission:
@ -558,14 +574,14 @@ After implementing and registering your factory:
2. **Through Code** (data seeding):
2. **Through Code** (data seeding):
```csharp
```csharp
await _workspaceRepository.InsertAsync(new Workspace (
await _applicationWorkspaceManager.CreateAsync (
GuidGenerator.Create() ,
name: "MyOllamaWorkspace" ,
"My OllamaWorkspace ",
provider: "Ollama",
provider: "Ollama",
modelName: "mistral"
modelName: "mistral",
);
apiBaseUrl: "http://localhost:11434",
workspace.ApiBaseUrl = "http://localhost:11434";
description: "Local Ollama workspace"
workspace.Description = "Local Ollama workspace";
) );
await _workspaceRepository.InsertAsync(workspace );
```
```
> **Tip** : The provider name you use in `AddFactory<TFactory>("ProviderName")` must match the provider name stored in the workspace configuration in the database.
> **Tip** : The provider name you use in `AddFactory<TFactory>("ProviderName")` must match the provider name stored in the workspace configuration in the database.