Concierge-Prozess bearbeiten: Offering ← Zurück zur Übersicht 1. Identität Gruppenschlüssel (nur bei Neuanlage) Anzeigename Aktiv (wird beim Intent-Routing berücksichtigt) 2. Routing Auslöse-Schlagwörter (JSON-Array) ["product","products","service","services","offer","offers","offering","offerings","subscription","pricing","catalog","angebot","angebote","produkt","produkte","dienstleistung","dienstleistungen","abo","abonnement","abonnements","preismodell","preismodelle","preis","preise","kategorie","kategorien","monatlich"] JSON-Array; Groß/Kleinschreibung egal. Keine Überschneidung mit anderen aktiven Gruppen. Erstellungsreihenfolge (Dienste) ["pricing_model","offering_type","offering_category","offering"] JSON-Array der Service-Schlüssel in kanonischer Erstellungsreihenfolge. Pflichtfelder je Dienst (JSON-Objekt) {"pricing_model":["model_name"],"offering_type":["type_name"],"offering_category":["category_name"],"offering":["offering_code","offering_name","type_id","category_id","pricing_model_id","base_price"]} JSON-Objekt: Dienst → Liste von Pflichtfeldnamen (keine _id-Felder — Fremdschlüssel werden zur Planzeit aufgelöst). 3. Plan-Template (deklarativ) plan_template_json { "records": [ { "service": "pricing_model", "fields": { "model_name": { "from": "model_name", "default": "One-Time Purchase" }, "model_description": { "from": "model_name", "default": "One-Time Purchase" }, "pricing_is_recurring": { "from": "pricing_is_recurring", "default": 0 }, "billing_cycle": { "from": "billing_cycle", "default": null }, "is_active": { "const": 1 } } }, { "service": "offering_type", "fields": { "type_name": { "from": "type_name", "default": "" }, "type_description": { "const": null }, "is_tangible": { "from": "is_tangible", "default": 0 }, "type_is_recurring": { "from": "type_is_recurring", "default": 0 }, "requires_shipping": { "from": "requires_shipping", "default": 0 }, "is_active": { "const": 1 } } }, { "service": "offering_category", "fields": { "category_name": { "from": "category_name", "default": "" }, "category_description": { "const": null }, "parent_category_id": { "const": null }, "is_active": { "const": 1 } } }, { "service": "offering", "fields": { "offering_code": { "derive": "slug", "from": "offering_name", "fallback": "offering", "skip_if": "skip" }, "offering_name": { "from": "offering_name", "default": "" }, "offering_description": { "from": "offering_description", "default": null }, "type_id": { "ref": "offering_type:0" }, "category_id": { "ref": "offering_category:0" }, "pricing_model_id": { "ref": "pricing_model:0" }, "base_price": { "from": "base_price", "default": 0, "cast": "float" }, "currency": { "from": "currency", "default": "EUR" }, "is_active": { "const": 1 }, "created_by": { "from": "created_by", "default": 1 } } } ] } Erlaubte Operatoren: {"from": "feld"}, {"from": "feld", "default": wert}, {"const": wert}, {"ref": "dienst:index"}, {"derive": "slug", "from": "feld"}, {"cast": "float|int|string"}. Leer lassen = PHP-Fallback (nur für die eingebaute offering-Gruppe). 4. Feld-Schema (Formular-Felder) Live-Vorschau (aus den Feldern gerendert) Model name * Pricing is recurring Billing cycle monthly quarterly annual Type name * Is tangible Type is recurring Requires shipping Category name * Offering name * Offering description Base price * Currency EUR USD GBP CHF fields_schema_json { "pricing_model": [ { "name": "model_name", "label_key": "txt_concierge_field_model_name", "type": "text", "collect": "both", "required": true }, { "name": "pricing_is_recurring", "label_key": "txt_concierge_field_pricing_is_recurring", "type": "checkbox", "collect": "both", "default": false }, { "name": "billing_cycle", "label_key": "txt_concierge_field_billing_cycle", "type": "select", "options": [ "monthly", "quarterly", "annual" ], "collect": "both" } ], "offering_type": [ { "name": "type_name", "label_key": "txt_concierge_field_type_name", "type": "text", "collect": "both", "required": true }, { "name": "is_tangible", "label_key": "txt_concierge_field_is_tangible", "type": "checkbox", "collect": "both", "default": false }, { "name": "type_is_recurring", "label_key": "txt_concierge_field_type_is_recurring", "type": "checkbox", "collect": "both", "default": false }, { "name": "requires_shipping", "label_key": "txt_concierge_field_requires_shipping", "type": "checkbox", "collect": "both", "default": false } ], "offering_category": [ { "name": "category_name", "label_key": "txt_concierge_field_category_name", "type": "text", "collect": "both", "required": true } ], "offering": [ { "name": "offering_name", "label_key": "txt_concierge_field_offering_name", "type": "text", "collect": "both", "required": true }, { "name": "offering_description", "label_key": "txt_concierge_field_offering_description", "type": "textarea", "collect": "both" }, { "name": "base_price", "label_key": "txt_concierge_field_base_price", "type": "number", "collect": "both", "required": true, "validation": { "min": 0 } }, { "name": "currency", "label_key": "txt_concierge_field_currency", "type": "select", "options": [ "EUR", "USD", "GBP", "CHF" ], "collect": "both", "default": "EUR" } ] } Feld-Deskriptoren je Dienst: name (eindeutig, == plan-template "from"), type (text|textarea|number|email|password|phone|select|radio|checkbox|hidden), label_key/label, collect (both|form|chat), required, options oder options_provider, when, validation, default. Chat-sichtbare Felder brauchen einen "from"-Schlüssel im Plan-Template. 5. Strategie (LLM-Prosa) Strategie-Dateiname Nur .md; wird unter config/concierge/strategies/ gespeichert. Markdown-Inhalt (8 erforderliche Abschnitte) Prosadokument für das Sprachmodell mit allen 8 Standard-Abschnitten (Role/Goal, Trigger Keywords, Group Members, Dependency Graph, Elicitable Fields, Completeness Gate, Validation Gate, Example Prompt). 6. Seed-Export (für andere Umgebungen) -- Concierge Customization Manager — exported group seed (idempotent). -- Apply once per project: -- sqlite3 /var/www/projects//dbase/sqlite/dbs/core.db -- < {project}/_ddl/concierge_group_offering.sql INSERT INTO concierge_group (group_key, name, trigger_keywords_json, dependencies_json, order_json, required_fields_json, plan_template_json, strategy_file, active, fields_schema_json) VALUES ('offering', 'Offering', '["product","products","service","services","offer","offers","offering","offerings","subscription","pricing","catalog","angebot","angebote","produkt","produkte","dienstleistung","dienstleistungen","abo","abonnement","abonnements","preismodell","preismodelle","preis","preise","kategorie","kategorien","monatlich"]', '{"pricing_model":[],"offering_type":[],"offering_category":[],"offering":["pricing_model","offering_type","offering_category"]}', '["pricing_model","offering_type","offering_category","offering"]', '{"pricing_model":["model_name"],"offering_type":["type_name"],"offering_category":["category_name"],"offering":["offering_code","offering_name","type_id","category_id","pricing_model_id","base_price"]}', '{"records":[{"service":"pricing_model","fields":{"model_name":{"from":"model_name","default":"One-Time Purchase"},"model_description":{"from":"model_name","default":"One-Time Purchase"},"pricing_is_recurring":{"from":"pricing_is_recurring","default":0},"billing_cycle":{"from":"billing_cycle","default":null},"is_active":{"const":1}}},{"service":"offering_type","fields":{"type_name":{"from":"type_name","default":""},"type_description":{"const":null},"is_tangible":{"from":"is_tangible","default":0},"type_is_recurring":{"from":"type_is_recurring","default":0},"requires_shipping":{"from":"requires_shipping","default":0},"is_active":{"const":1}}},{"service":"offering_category","fields":{"category_name":{"from":"category_name","default":""},"category_description":{"const":null},"parent_category_id":{"const":null},"is_active":{"const":1}}},{"service":"offering","fields":{"offering_code":{"derive":"slug","from":"offering_name","fallback":"offering","skip_if":"skip"},"offering_name":{"from":"offering_name","default":""},"offering_description":{"from":"offering_description","default":null},"type_id":{"ref":"offering_type:0"},"category_id":{"ref":"offering_category:0"},"pricing_model_id":{"ref":"pricing_model:0"},"base_price":{"from":"base_price","default":0,"cast":"float"},"currency":{"from":"currency","default":"EUR"},"is_active":{"const":1},"created_by":{"from":"created_by","default":1}}}]}', 'offering.md', 1, '{"pricing_model":[{"name":"model_name","label_key":"txt_concierge_field_model_name","type":"text","collect":"both","required":true},{"name":"pricing_is_recurring","label_key":"txt_concierge_field_pricing_is_recurring","type":"checkbox","collect":"both","default":false},{"name":"billing_cycle","label_key":"txt_concierge_field_billing_cycle","type":"select","options":["monthly","quarterly","annual"],"collect":"both"}],"offering_type":[{"name":"type_name","label_key":"txt_concierge_field_type_name","type":"text","collect":"both","required":true},{"name":"is_tangible","label_key":"txt_concierge_field_is_tangible","type":"checkbox","collect":"both","default":false},{"name":"type_is_recurring","label_key":"txt_concierge_field_type_is_recurring","type":"checkbox","collect":"both","default":false},{"name":"requires_shipping","label_key":"txt_concierge_field_requires_shipping","type":"checkbox","collect":"both","default":false}],"offering_category":[{"name":"category_name","label_key":"txt_concierge_field_category_name","type":"text","collect":"both","required":true}],"offering":[{"name":"offering_name","label_key":"txt_concierge_field_offering_name","type":"text","collect":"both","required":true},{"name":"offering_description","label_key":"txt_concierge_field_offering_description","type":"textarea","collect":"both"},{"name":"base_price","label_key":"txt_concierge_field_base_price","type":"number","collect":"both","required":true,"validation":{"min":0}},{"name":"currency","label_key":"txt_concierge_field_currency","type":"select","options":["EUR","USD","GBP","CHF"],"collect":"both","default":"EUR"}]}') ON CONFLICT(group_key) DO UPDATE SET name = excluded.name, trigger_keywords_json = excluded.trigger_keywords_json, dependencies_json = excluded.dependencies_json, order_json = excluded.order_json, required_fields_json = excluded.required_fields_json, plan_template_json = excluded.plan_template_json, strategy_file = excluded.strategy_file, active = excluded.active, fields_schema_json = excluded.fields_schema_json; Idempotentes SQL-Snippet zum Übertragen dieser Konfiguration auf Staging/Produktion. 7. Benötigte Code-Änderungen (manuell anzuwenden) Diese Änderungen sind nötig, damit der Prozess vollständig funktioniert. Sie werden nicht automatisch angewendet. Add a deterministic question phrasing for 'type_id' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'type_id' => 'Please provide the type_id value?', Add a deterministic question phrasing for 'category_id' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'category_id' => 'Please provide the category_id value?', Add a deterministic question phrasing for 'pricing_model_id' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'pricing_model_id' => 'Please provide the pricing_model_id value?', Add a deterministic question phrasing for 'model_description' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'model_description' => 'Please provide the model_description value?', Add a deterministic question phrasing for 'pricing_is_recurring' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'pricing_is_recurring' => 'Please provide the pricing_is_recurring value?', Add a deterministic question phrasing for 'billing_cycle' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'billing_cycle' => 'Please provide the billing_cycle value?', Add a deterministic question phrasing for 'is_active' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'is_active' => 'Please provide the is_active value?', Add a deterministic question phrasing for 'type_description' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'type_description' => 'Please provide the type_description value?', Add a deterministic question phrasing for 'is_tangible' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'is_tangible' => 'Please provide the is_tangible value?', Add a deterministic question phrasing for 'type_is_recurring' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'type_is_recurring' => 'Please provide the type_is_recurring value?', Add a deterministic question phrasing for 'requires_shipping' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'requires_shipping' => 'Please provide the requires_shipping value?', Add a deterministic question phrasing for 'category_description' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'category_description' => 'Please provide the category_description value?', Add a deterministic question phrasing for 'parent_category_id' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'parent_category_id' => 'Please provide the parent_category_id value?', Add a deterministic question phrasing for 'offering_description' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'offering_description' => 'Please provide the offering_description value?', Add a deterministic question phrasing for 'created_by' packages/php-code/plugins/PlgMasterDataConcierge/workflows/conciergeSession/processors/ElicitProcessor.php (questionFor(), lines ~101-113) + 'created_by' => 'Please provide the created_by value?', Speichern Abbrechen