You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/copilot-instructions.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -104,6 +104,7 @@ dotnet run
104
104
* When an object initializer spans multiple lines, place each property assignment on its own line.
105
105
* Format conditional (`?:`) operators across multiple lines with the condition, `?`, and `:` each on their own properly indented lines.
106
106
* Always keep exactly one trailing newline at the end of each file.
107
+
* In `.cshtml` files, never introduce stray carriage returns (`^M`) or CRCRLF line endings; keep view files normalized so they do not render with artificial blank lines.
107
108
108
109
#### `#pragma` Rules
109
110
@@ -159,6 +160,7 @@ dotnet run
159
160
#### JavaScript in `.cshtml`
160
161
161
162
* Ensure proper indentation for all JavaScript inside `.cshtml` files.
163
+
* When editing `.cshtml` files, preserve normalized line endings and remove any stray `^M`/CRCRLF formatting damage instead of leaving it in place.
162
164
163
165
#### Architecture & Design
164
166
@@ -397,6 +399,7 @@ If CloudSmith is inaccessible, only asset builds and code analysis are possible.
397
399
-**Authorization handlers**: Do not constructor-inject `IAuthorizationService` into an `AuthorizationHandler`. Resolve and cache it lazily inside the handler because the authorization pipeline can otherwise create circular dependencies.
398
400
-**Collection handling**: Do not call `.ToList()` or `.ToArray()` unless a concrete snapshot is truly required for correctness or lifetime safety. Prefer consuming `IEnumerable<T>` directly when you only need to iterate.
399
401
-**Localization extraction**: When using `ILocalizer`, the property/variable must be named `S`, and localized strings must use the literal pattern `S["This is a localized string"]`. Do not use variables inside the brackets because extraction tooling looks specifically for `S["..."]`.
402
+
-**Select lists from enums**: Do not build Orchard `SelectListItem` collections by iterating enums with `Enum.GetValues(...)` and piping `ToString()` into the text. Define each item explicitly so the title uses `S["..."]` for extraction and multi-word labels can use the correct spacing.
400
403
-**Settings UI casing**: Use sentence case for settings labels, hints, and warning headings. Keep placement tab/card/column names and admin menu labels in title case.
401
404
-**Catalog entry handlers**: When a feature must react to create, update, or delete operations for catalog-backed models, prefer `CatalogEntryHandlerBase<T>` registered as `ICatalogEntryHandler<T>` and route write operations through the matching catalog manager so the handler events actually run. Do not rely on raw store writes alone when handler lifecycle behavior is required.
402
405
-**Deferred third-party work**: When a catalog handler must call indexing systems, external APIs, or other third-party/background-style services, follow the deferred task pattern used by `ChatInteractionHandler` and `AIMemoryEntryHandler`: capture the affected models/IDs in the scoped handler and schedule the work with `ShellScope.AddDeferredTask(...)` so the external work runs later instead of inline during the catalog event.
("ApiKey",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("Contained-connection API key alias for recipe imports. Supported by AzureSpeech deployments.")),
51
51
("IdentityId",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("Contained-connection managed identity client ID alias for recipe imports. Supported by AzureSpeech deployments.")),
newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The deployment type, or a comma-separated flag value such as 'Chat, Utility'. Defaults to Chat when not specified."),
53
+
("Purpose",newJsonSchemaBuilder().AnyOf(
54
+
newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The deployment purpose, or a comma-separated flag value such as 'Chat, Utility'. Defaults to Chat when not specified."),
("DefaultUtilityDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default utility deployment.")),
25
25
("DefaultEmbeddingDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default embedding deployment.")),
26
26
("DefaultImageDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default image generation deployment.")),
27
+
("DefaultVisionDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default vision deployment.")),
27
28
("DefaultSpeechToTextDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default speech-to-text deployment.")),
28
29
("DefaultTextToSpeechDeploymentName",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The technical name of the default text-to-speech deployment.")),
29
30
("DefaultTextToSpeechVoiceId",newJsonSchemaBuilder().Type(SchemaValueType.String).Description("The voice identifier to use for text-to-speech.")))
Copy file name to clipboardExpand all lines: src/CrestApps.Docs/docs/ai/chat-interactions.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,6 +31,7 @@ This module provides ad-hoc AI chat interactions with configurable parameters, e
31
31
- User memory — persist private, non-sensitive preferences and durable background details for authenticated users
32
32
- Chat mode — configurable voice interaction modes (Text Only, Audio Input, Conversation) for speech-to-text dictation and two-way voice chat
33
33
- Prompt-template composition — add multiple reusable prompt templates from a searchable picker and provide per-template JSON parameters
34
+
- Vision-aware knowledge uploads — the Knowledge tab updates its supported formats immediately when you switch the chat deployment, so image-capable models expose image upload extensions without reloading the page
34
35
35
36
## Getting Started
36
37
@@ -47,6 +48,8 @@ When a response cites uploaded or indexed content, the interaction UI renders `[
47
48
48
49
The admin **Chat Interactions** list includes integrated search, multi-select, and bulk actions through the shared list management resource used across CrestApps admin catalogs.
49
50
51
+
When the **AI Documents** feature is enabled, the **Knowledge** tab shows the current supported upload formats directly under the file picker. That list refreshes immediately when you change the selected chat deployment, including the **Default** option when the tenant default chat deployment supports vision.
52
+
50
53
## Orchestration
51
54
52
55
Each chat interaction session is bound to an orchestrator that manages the execution pipeline. The orchestrator handles:
@@ -185,4 +188,3 @@ To enable image generation, create an `AIDeployment` record with type `Image` fo
Copy file name to clipboardExpand all lines: src/CrestApps.Docs/docs/ai/chat.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -142,6 +142,8 @@ If a profile allows session documents, the chat UI keeps restored widget session
142
142
143
143
The admin and frontend chat widgets restore their saved toggle and panel positions before the chat app finishes initializing.
144
144
145
+
The admin session chat now shows the same compact **Supported formats** note above the input attachment bar that the widgets already expose, so users can see the exact upload extensions allowed for the current profile and vision capability.
146
+
145
147
By default, session-document uploads are stored on the local file system through the shared AI Documents storage pipeline. If you want widget uploads stored in Azure Blob Storage instead, enable `CrestApps.OrchardCore.AI.Documents.Azure` and configure it as described in [AI Documents - Azure Blob Storage](./documents/azure-blob-storage.md).
0 commit comments