From c1760dfb34aa856dff4d36bf2f6c8fee68b94cd0 Mon Sep 17 00:00:00 2001 From: Matthew Myers Date: Tue, 20 Feb 2024 13:08:15 -0500 Subject: [PATCH] User job title and AI context. --- .../src/Filament/Pages/PersonalAssistant.php | 12 +++++++++--- .../src/Client/BaseAIChatClient.php | 2 +- .../src/DataTransferObjects/DynamicContext.php | 14 +++++++++----- .../Models/Concerns/ProvidesDynamicContext.php | 2 +- app/Filament/Resources/UserResource.php | 4 ++++ app/Models/User.php | 15 ++++++++++++++- .../2023_03_06_000004_create_users_table.php | 1 + 7 files changed, 39 insertions(+), 11 deletions(-) diff --git a/app-modules/assistant/src/Filament/Pages/PersonalAssistant.php b/app-modules/assistant/src/Filament/Pages/PersonalAssistant.php index acbee15e86..dd780d6481 100644 --- a/app-modules/assistant/src/Filament/Pages/PersonalAssistant.php +++ b/app-modules/assistant/src/Filament/Pages/PersonalAssistant.php @@ -64,6 +64,7 @@ use AdvisingApp\Assistant\Enums\AssistantChatShareWith; use AdvisingApp\IntegrationAI\Client\Contracts\AIChatClient; use AdvisingApp\IntegrationAI\Exceptions\ContentFilterException; +use AdvisingApp\IntegrationAI\DataTransferObjects\DynamicContext; use AdvisingApp\IntegrationAI\Exceptions\TokensExceededException; use Illuminate\Database\Eloquent\Collection as EloquentCollection; use AdvisingApp\Assistant\Services\AIInterface\Enums\AIChatMessageFrom; @@ -220,9 +221,14 @@ public function sendMessage(): void public function ask(AIChatClient $ai): void { try { - $this->currentResponse = $ai->ask($this->chat, function (string $partial) { - $this->stream('currentResponse', nl2br($partial)); - }); + /** @var User $user */ + $user = auth()->user(); + + $this->currentResponse = $ai + ->provideDynamicContext(new DynamicContext($user)) + ->ask($this->chat, function (string $partial) { + $this->stream('currentResponse', nl2br($partial)); + }); } catch (ContentFilterException|TokensExceededException $e) { $this->renderError = true; $this->error = $e->getMessage(); diff --git a/app-modules/integration-ai/src/Client/BaseAIChatClient.php b/app-modules/integration-ai/src/Client/BaseAIChatClient.php index 417ffee734..6deac729f4 100644 --- a/app-modules/integration-ai/src/Client/BaseAIChatClient.php +++ b/app-modules/integration-ai/src/Client/BaseAIChatClient.php @@ -94,7 +94,7 @@ public function ask(Chat $chat, ?Closure $callback): string public function provideDynamicContext(DynamicContext $context): self { - $this->setDynamicContext($context->context); + $this->setDynamicContext($context->getContext()); return $this; } diff --git a/app-modules/integration-ai/src/DataTransferObjects/DynamicContext.php b/app-modules/integration-ai/src/DataTransferObjects/DynamicContext.php index 0f60c219fe..d5a8502bef 100644 --- a/app-modules/integration-ai/src/DataTransferObjects/DynamicContext.php +++ b/app-modules/integration-ai/src/DataTransferObjects/DynamicContext.php @@ -37,16 +37,20 @@ namespace AdvisingApp\IntegrationAI\DataTransferObjects; use Spatie\LaravelData\Data; -use AdvisingApp\IntegrationAi\Models\Concerns\ProvidesDynamicContext; +use AdvisingApp\IntegrationAI\Models\Concerns\ProvidesDynamicContext; class DynamicContext extends Data { - public ProvidesDynamicContext $record; + private ?string $context; - public ?string $context; + public function __construct( + protected ProvidesDynamicContext $record + ) { + $this->context = $this->record->getDynamicContext(); + } - public function __construct() + public function getContext(): ?string { - $this->context = $this->record->getDynamicContext(); + return $this->context; } } diff --git a/app-modules/integration-ai/src/Models/Concerns/ProvidesDynamicContext.php b/app-modules/integration-ai/src/Models/Concerns/ProvidesDynamicContext.php index 03d69a53d1..167a156012 100644 --- a/app-modules/integration-ai/src/Models/Concerns/ProvidesDynamicContext.php +++ b/app-modules/integration-ai/src/Models/Concerns/ProvidesDynamicContext.php @@ -34,7 +34,7 @@ */ -namespace AdvisingApp\IntegrationAi\Models\Concerns; +namespace AdvisingApp\IntegrationAI\Models\Concerns; use Illuminate\Database\Eloquent\Model; diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php index 320a63bb88..fb8b109db3 100644 --- a/app/Filament/Resources/UserResource.php +++ b/app/Filament/Resources/UserResource.php @@ -93,6 +93,9 @@ public static function form(Form $form): Form ->email() ->required() ->maxLength(255), + TextInput::make('job_title') + ->string() + ->maxLength(255), Toggle::make('is_external') ->label('User can only log in via a social provider.'), TextInput::make('created_at') @@ -122,6 +125,7 @@ public static function table(Table $table): Table TextColumn::make('name'), TextColumn::make('email') ->label('Email address'), + TextColumn::make('job_title'), TextColumn::make('created_at') ->label('Created At') ->dateTime(config('project.datetime_format') ?? 'Y-m-d H:i:s') diff --git a/app/Models/User.php b/app/Models/User.php index 3395276213..0ec86903c2 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -91,12 +91,13 @@ use AdvisingApp\Notification\Models\Contracts\NotifiableInterface; use AdvisingApp\ServiceManagement\Models\ServiceRequestAssignment; use AdvisingApp\Engagement\Models\Concerns\HasManyEngagementBatches; +use AdvisingApp\IntegrationAI\Models\Concerns\ProvidesDynamicContext; use AdvisingApp\ServiceManagement\Enums\ServiceRequestAssignmentStatus; /** * @mixin IdeHelperUser */ -class User extends Authenticatable implements HasLocalePreference, FilamentUser, Auditable, HasMedia, HasAvatar, NotifiableInterface, HasFilamentResource +class User extends Authenticatable implements HasLocalePreference, FilamentUser, Auditable, HasMedia, HasAvatar, NotifiableInterface, HasFilamentResource, ProvidesDynamicContext { use DefinesPermissions; use HasFactory; @@ -169,6 +170,7 @@ class User extends Authenticatable implements HasLocalePreference, FilamentUser, 'working_hours_are_enabled', 'are_working_hours_visible_on_profile', 'working_hours', + 'job_title', ]; public $orderable = [ @@ -498,6 +500,17 @@ public function getApiPermissions(): Collection return collect(['view-email', ...$this->apiPermissions()]); } + public function getDynamicContext(): string + { + $context = "My name is {$this->name}"; + + if ($this->job_title) { + $context .= " and I am a {$this->job_title}"; + } + + return "{$context}. When you respond please use this information about me to tailor your response."; + } + protected function serializeDate(DateTimeInterface $date): string { return $date->format(config('project.datetime_format') ?? 'Y-m-d H:i:s'); diff --git a/database/migrations/2023_03_06_000004_create_users_table.php b/database/migrations/2023_03_06_000004_create_users_table.php index 482e6bdb1a..7f52f3ab1e 100644 --- a/database/migrations/2023_03_06_000004_create_users_table.php +++ b/database/migrations/2023_03_06_000004_create_users_table.php @@ -73,6 +73,7 @@ public function up(): void $table->boolean('working_hours_are_enabled')->default(false); $table->boolean('are_working_hours_visible_on_profile')->default(false); $table->jsonb('working_hours')->nullable(); + $table->string('job_title')->nullable(); $table->foreignUuid('pronouns_id')->nullable()->constrained('pronouns')->nullOnDelete(); $table->boolean('are_pronouns_visible_on_profile')->default(false);