フロントエンド (JS アセット)
Lase は Vue 3 ベースのフロントエンドアセットを NPM パッケージ @codebase-jp/lase として提供します。
インストール
npm install @codebase-jp/laseピア依存関係も合わせてインストールしてください:
npm install vue axios bootstrap bootstrap-icons dayjs vue-router @codebase-jp/vaseモジュール構成
パッケージはコンテキスト別にモジュールが分かれています。
@codebase-jp/lase
├── api/
│ ├── admin/ 管理者 API クライアント
│ ├── tenant/ テナント API クライアント
│ ├── common/ 共通 API クライアント
│ └── public/ パブリック API クライアント
├── components/
│ ├── admin/ 管理画面コンポーネント
│ ├── tenant/ テナント画面コンポーネント
│ └── common/ 共通コンポーネント
├── composables/
│ ├── admin/ 管理者向け composable
│ └── common/ 共通 composable
├── views/
│ ├── admin/ 管理画面ビュー(Vue SFC)
│ ├── tenant/ テナント画面ビュー
│ ├── public/ パブリック画面ビュー
│ └── common/ 共通ビュー
├── routes/
│ ├── admin/ 管理者ルート定義
│ ├── tenant/ テナントルート定義
│ └── public/ パブリックルート定義
├── models/ TypeScript 型定義モデル
├── enums/ TypeScript Enum
├── filters/ フィルター関数
├── utils/ ユーティリティ関数
└── types/ 共通型定義Composables
共通
| composable | 説明 |
|---|---|
useApp | アプリケーション情報の取得・管理 |
useAuth | 認証状態・ログイン・ログアウト |
useAiChat | AI チャット |
useConfig | フロントエンド設定値の取得(詳細) |
useLogger | クライアントログの送信 |
useRecaptcha | reCAPTCHA v3 トークン取得 |
テナント
| composable | 説明 |
|---|---|
useEntitlement | テナントの有効なエンタイトルメント(機能・利用上限・利用量)の取得と判定 |
管理者
| composable | 説明 |
|---|---|
useSenter | Senter 課金サービスとの連携 |
useConfig
useConfig は、サーバーサイドの設定値をフロントエンドで参照するための composable です。
仕組み
Lase は GET /config エンドポイントを提供しており、Laravel の設定値(config('lase.front') と config('front'))をマージして window.__CONFIG__ としてブラウザに渡します。Blade テンプレートで以下のように読み込みます:
<script src="/config"></script>useConfig はこの window.__CONFIG__ の値を読み取ります。
設定値の定義
設定値は以下の 2 箇所で定義できます。アプリ側(config/front.php)の値が優先されます。
| ファイル | 説明 |
|---|---|
config/lase.php の front キー | パッケージ側のデフォルト値 |
config/front.php | アプリ側で追加・上書き |
// config/front.php
return [
'recaptcha_site_key' => env('FRONT_RECAPTCHA_SITE_KEY'),
'docs_url' => env('FRONT_DOCS_URL', '/docs/'),
];WARNING
/config のレスポンスはブラウザに公開されます。秘密鍵やパスワードなどの機密情報は絶対に含めないでください。
API
import useConfig from '@codebase-jp/lase/composables';
const { config, get, has } = useConfig();| プロパティ / メソッド | 型 | 説明 |
|---|---|---|
config | Record<string, ConfigValue> | 設定オブジェクト全体 |
get(key, defaultValue?) | <T>(key: string, defaultValue?: T) => T | undefined | ドット記法で値を取得 |
has(key) | (key: string) => boolean | キーが存在するか判定 |
使用例
const { get, has } = useConfig();
// 値を取得
const siteKey = get<string>('recaptcha_site_key');
// デフォルト値付き
const docsUrl = get<string>('docs_url', '/docs/');
// ネストされた値をドット記法で取得
const value = get<string>('nested.deep.key');
// 存在チェック
if (has('recaptcha_site_key')) {
// ...
}AiChat
RAG(AiEmbeddingService)と連携する AI チャット UI です。
<script lang="ts" setup>
import { AiChat } from '@codebase-jp/lase/components';
</script>
<template>
<AiChat />
</template>Props
| prop | 既定値 | 説明 |
|---|---|---|
placeholder | メッセージを入力... | 入力欄のプレースホルダ |
welcomeMessage | こんにちは!… | 初回表示時のメッセージ |
suggestions | ログイン/パスワード/問い合わせの3件 | 質問例のボタン。[] で非表示 |
showSources | true | 回答の参照元ドキュメントを表示するか |
autofocus | true | 表示直後に入力欄へフォーカスするか |
挙動
- Markdown 描画 — 回答は Markdown として描画されます。LLM の出力はドキュメント経由のプロンプトインジェクションを含み得るため、
ChatMarkdownUtilが許可リスト方式でサニタイズします(script/iframe/img/ イベントハンドラ属性 /javascript:リンクは除去)。ユーザーの発言は Markdown として解釈せずそのまま表示します。 - 参照元の表示 — バックエンドが RAG で参照したドキュメントを AI SDK の
source-documentパートとして通知します。docs_urlを基に閲覧用リンクへ変換して表示します。 - スクロール追従 — 最下部付近にいる間だけ自動追従します。読み返し中に引き戻されません。
- 入力 — Enter で送信、Shift+Enter で改行、日本語入力の変換確定中は送信しません。高さは入力量に応じて自動調整されます。応答中も入力は可能です(送信のみ抑止)。
- 中断・再試行・リセット — 応答中は停止ボタン、エラー時は再試行ボタン、会話のリセットボタンを表示します。
TIP
AiChat 自体はチャットの中身(メッセージ一覧・入力欄)のみを提供します。画面右下に浮かべる起動ボタン・パネルごと欲しい場合は、下記の AiChatWidget を使ってください。
AiChatWidget
AiChat を画面右下の起動ボタン(FAB)とパネルで包んだ、すぐ使える形の共通ウィジェットです。アプリのルートコンポーネントに1つ置くだけで、全画面共通のAIアシスタントを提供します。
<script lang="ts" setup>
import { AiChatWidget } from '@codebase-jp/lase/components';
</script>
<template>
<AiChatWidget />
</template>Props
AiChat の placeholder / welcomeMessage / suggestions / showSources をそのまま受け取り、AiChat へ引き渡します(autofocus は非表示中のフォーカスを避けるため常に false で固定)。加えて以下を持ちます。
| prop | 既定値 | 説明 |
|---|---|---|
label | AIアシスタント | パネルのタイトル・起動ボタンの aria-label |
挙動
- 起動ボタンはクリックでパネルの開閉をトグルします。パネルは
Escキーでも閉じられます。 - パネルは
v-showで保持されるため、閉じても会話は消えません。 - 幅576px未満の画面では、パネルが画面幅いっぱいに近い大きさになります。
TIP
チャット枠を独自にカスタマイズしたい場合(サイドバーに埋め込む等)は、AiChatWidget ではなく AiChat を直接使ってください。
管理画面ビュー
管理画面の Vue コンポーネントが提供されています。
| ディレクトリ | 説明 |
|---|---|
views/admin/dashboard/ | ダッシュボード |
views/admin/tenants/ | テナント管理 |
views/admin/users/ | ユーザー管理 |
views/admin/plans/ | プラン管理 |
views/admin/announcements/ | お知らせ管理 |
views/admin/admin-users/ | 管理者ユーザー管理 |
views/admin/admin-roles/ | 管理者ロール管理 |
views/admin/admin-mails/ | メール管理 |
views/admin/admin-images/ | 画像管理 |
views/admin/inquiries/ | お問い合わせ管理 |
views/admin/blocked-domains/ | 禁止ドメイン管理 |
views/admin/tenant-roles/ | テナントロール管理 |
ルーティング
Lase のルートをアプリの Vue Router に組み込む例:
import { createRouter, createWebHistory } from 'vue-router';
import adminRoutes from '@codebase-jp/lase/routes/admin';
import tenantRoutes from '@codebase-jp/lase/routes/tenant';
const router = createRouter({
history: createWebHistory(),
routes: [
...adminRoutes,
...tenantRoutes,
],
});TypeScript 型
モデルの TypeScript 型は @codebase-jp/lase/models からインポートできます:
import type { Tenant, User, Subscription, Plan } from '@codebase-jp/lase/models';