1. 全体構成
Davar Web(www2.davarkg.com)が教会の公式Web情報の正本、Blogger(davarjp.blogspot.com)が日本支部ブログとみことばカード原記事の正本、Member Web(d.cblh.us/members-home/)がそれらの更新と会員向けコンテンツを集約する会員ページ兼アプリAPIの入口、Davar AIが検索と回答生成の担当です。Dropboxは週次資料と生成物の受け渡し場所で、アプリがDropboxへ直接接続することはありません。
オンライン利用時の主経路
Config・Bible AI用トークンはKeychainに保持
davar.jly.me(優先)d.cblh.us(読取fallback)サインインなしでWordPressから応答
rh10のローカルRAG→ LiteLLM → Claude → 出典検証
Davar App
表示と操作を担当します。Home、教会ページ、メディアは公開APIを使い、サーバー設定とBible AIは会員トークン付きAPIを利用します。どちらもWordPress側の /wp-json/davar/v1/app/* が入口です。
Member Web
d.cblh.us/members-home/で会員ページを提供し、Davar Webの公式更新を定期取得してアプリ用Home Snapshotへ整形します。同じWordPressホストが週報・動画アセット、公開アプリAPI、Bible AI認証、質問のレート制限・出典検証・プロキシも担当します。
Davar AI
Open WebUI上のKnowledge、ローカル検索、検索結果の再順位付け、モデルへのコンテキスト注入を担当します。
Davar Web / Blogger / 外部サービス
Davar Web(www2.davarkg.com)は公式Web情報、Bloggerは日本支部ブログとみことばカード原記事の正本です。Dropboxは週次ファイル交換、AWS Pollyは音声生成、Anthropic Claudeは通常のBible AI回答生成に使います。接続先と境界は外部連携台帳にまとめています。
実際のコード・稼働仕様との照合結果
以下は、iOS App、Member Web、Davar AI、週次処理のコードと2026年9月3日の本番read-backを対応付けた現在値です。画面上の名称ではなく、通信・保存・失敗時動作を基準にしています。
| 経路 | 認証 | 主なendpoint/実装 | 失敗時 |
|---|---|---|---|
| 公開読取 | 会員token不要 | GET /app/home、/newsletter-text、/media-series、/content、/photos、/memory-verse-cards | Homeは端末の前回snapshot、menu/pageは最後の正常版または内蔵版、各画面は空表示などへ安全に縮退 |
| 会員機能 | 共通passwordから発行した端末別token | GET /app/config、POST /app/chat、POST /app/logout | 401時は再認証。Davar固有回答に関連資料がなければ生成文を破棄して503 |
| 用途限定操作 | 機能別session/admin token | 写真・動画投稿、みことばカード/Blogger投稿、通知管理、注文/復元、部屋割り | Bible AIのtokenと混用しない。権限・整合性を満たさない変更は拒否 |
| 通信先 | TLS | 優先 https://davar.jly.me、fallback https://d.cblh.us | DNS/host接続失敗時のGET/HEADだけ別originを再試行。POST/PATCH/DELETEは重複変更を避けるため再送しない |
Server-managed menuの防御
/app/contentは512 KiB、schema v1、menu 20組×20項目、50 page、各100 block、100 announcementまでです。HTTPS・port 443・認証情報なし・davarkg.com/cblh.us/jly.me/davar.org配下だけを許可し、ETagで再検証します。不正な新文書は最後の正常版を置き換えません。
現在利用中と、実装済みだが自動ではないもの
現在のiOS会員認証は共通password→端末別tokenです。次回のiOS更新では設定の最上部にUser Setupを置き、このログインと1つ以上の所属支部が揃った時だけ完了表示にします。password自体は保存せず、発行された端末別tokenだけをKeychainへ保存します。個人account/Sign in with Appleのserver実装は現在のiOS標準経路ではありません。Ollamaは手動選択、YouTubeへの週次uploadは実装されていますが既定offで、いずれも自動fallback/自動公開ではありません。
webui.dbのPersistentConfigです。本番read-backは BAAI/bge-m3、hybrid検索、BM25 weight 0.5、top-k 8、BAAI/bge-reranker-v2-m3、rerank後top-k 6、chunk 800/overlap 100でした。実装に照合した構成図
システム全体の相関、オンライン連携、www2公式更新、週次更新とKnowledge登録、ユーザー質問とRAGを図にまとめています。静的SVGのため、外部の描画サービスやJavaScriptを必要としません。
完全相関図:Davar Web / Member Web / App / AI / Weekly Task
全体連携:Davar Web / Member Web / App / AI
公式サイト更新:Davar Web → Member Web → iPhone
週次更新:4資料からWebとKnowledgeへ
質問処理:ローカルRAGから回答と出典まで
2. ユーザーがアプリを使うとき
Home、教会ページ、メディア、ニュースレターはサインインなしで利用できます。設定画面自体は開けますが、serverのAI設定を取得するGET /app/configは会員tokenが必要で、未認証時は内蔵設定を使います。Davar Web由来の項目をタップした後は、元記事をアプリ内ブラウザで開きます。
公開コンテンツ → 必要な場合だけBible AIへサインイン
corneliusFellowship を配信します。更新後のiOS Appはこの識別子を固定URL https://messages.davarkg.comへ対応付けてApp内で開き、読込中、再読込、pull-to-refresh、通信失敗時の再試行を提供します。この新しい組み込みメニューを表示するにはAppの更新が必要です。rh10、Open WebUI、Dropboxへ直接ログインしません。WordPressが公開コンテンツと認証済みBible AIの共通APIゲートウェイです。聖書機能は端末内データ、Bible AIはnetwork機能
聖書本文、原語、Strong’s辞書、コメンタリー、TSKクロスリファレンス、福音書並行箇所は、アプリに同梱した読取専用DavarBible.sqliteから表示します。聖書を読むたびにMember Webや外部Bible APIから本文を取得する構成ではありません。
端末内で動く機能
口語訳、KJV、WLC旧約ヘブライ語、Delitzsch新約ヘブライ語訳、Swete LXX、Robinson-Pierpontギリシャ語新約、WEB、節番号対応、検索・並列表示・学習資料を同梱しています。ハイライト、メモ、検索履歴も端末内だけに保存し、cloud同期しません。
networkへ出る機能
Bible AIへ送信した質問と直近6件までの会話はMember WebとDavar AIを通ります。アプリの「出典とライセンス」でeKotoba、BibleEngine、OpenScriptures、Wikisource、First1KGreek、STEPBible、eBible.org、Bible Researcher等の公開元リンクを利用者が選んだ場合はbrowserを開きます。
教会写真・動画の収集と公開
Version 1.7以降の「教会写真・動画」は、管理者が運用する恒久的な素材ライブラリです。一般的なSNSではなく、ダイレクトメッセージ、公開プロフィール、フォローはありません。恒久ギャラリーは全体を表示し、2026 JBS/SBSの入口はserver所有のイベントタグで対象素材だけに限定します。投稿用sessionはBible AIの会員サインインと分離されています。
選択 → background upload → server検証 → Public配信
publicationMode=immediateを明示し、本番flagが有効な場合だけ直ちにPublicとして保存します。古い/不明なclientは引き続きpending / Privateです。2026JBS、2026SBSのscopeを割り当てます。タグはmedia rowと同じtransactionで保存し、schema・read・writeを検証できなければHTTP 503で停止します。管理者は公開状態、タグ、回転、download、削除を管理します。権限とセッション
- 一般利用者:公開slideshowの閲覧。公開変更、download、削除は不可
- 投稿用session:全albumのPublic閲覧、投稿、通報。downloadや公開変更は不可
- 投稿者:有効な同一投稿session中、自分の素材を閲覧・削除
- 管理者:Privateを含む閲覧、Public / Private変更、回転、download、削除
- 期限付きsession、署名付きURL、server側hash化credential、server所有タグで境界を維持
閲覧・取得
- Public / 投稿 / Downloadを別tabに分離
- 写真/動画、撮影開始日/終了日でfilterし複数選択
- 写真を1080p / 720p / 480p / 240pへ一括変換
- iOS slideshowは写真/動画/Mix、random、Ken Burns、動画音量に対応
実装・release QAで確定した運用原則
| 領域 | 確認された失敗 | 恒久ルール |
|---|---|---|
| background upload | chunk N完了callback後にN+1を作る方式では、suspend中に連鎖が止まり、再度アプリを開くまで続かなかった | active中に全missing chunkをbackground sessionへ登録し、callbackは完了管理、全chunk確認後にfinalizeする |
| 2列card | outer insetに加えてgrid内でもhorizontal paddingを引き、右列と管理者操作が画面外へ出た | 利用可能幅からouter insetと列間隔を一度だけ引く。存在確認だけでなく左右両列の全操作がwindow bounds内かをUI testで検査する |
| Simulator QA | /Volumes/XcodeSimはAPFS表示でも、実体が外付けT9上のsparsebundleだった | 固定のDavar SBS LocalSSD QAだけを使い、Simulator data、DerivedData、xcresultの実pathが内蔵SSDかを個別確認する |
| 審査中build差し替え | build uploadだけでは審査submissionの添付buildは変わらない | 新buildのVALIDとTestFlight groupを確認し、dry-run後に対象iOS submissionだけを差し替え、screenshot・添付build・iOS/tvOS両stateをread-backする |
| 完全UI後の部分修復 | 完走した完全UIでtest側の検索・同期・fixture・assertionが失敗すると、同じ数時間の完全suite再実行が必要になっていた | 全失敗を個別に原因特定し、製品sourceが不変でtest/harnessだけを修正した場合は、同じproduction controlと下流assertionを保つ該当部分testの合格と独立reviewで閉じる。未完走、未解明、runtime前提不足、製品失敗・製品source変更は完全suiteを再実行する |
3. Bloggerとアプリのみことばカード投稿を同期するとき
davarjp.blogspot.comの「みことばカード」ラベル付き原記事をMember Webへ取り込む定期処理に加え、認証済みアプリ投稿画面はBlogger投稿フォームとして動作します。フォームからの投稿はすべてBloggerへ公開しますが、アプリのギャラリーは現在のラベルに完全一致する「みことばカード」がある投稿だけを表示します。
Blogger原記事 → 事前照合 → 投稿日+原画像+縮小画像 → Member Webギャラリー
davarjp.blogspot.com、画像はblogger.googleusercontent.comだけを許可します。sourceURLとdeletedSourceHashesを照合します。登録済みURLと、利用者または管理者が削除したURLは、認証・画像download・uploadより前に除外します。新規が0件なら認証も本番変更も行いません。sourceURL、原画像、縮小画像を一緒に送ります。sourceURLと画像内容の重複を検査します。削除済みURLならHTTP 409 mikotoba_card_deletedで拒否するため、古い/独自のimport処理からも復活できません。削除記録を保存できない場合は、カードを消さずHTTP 503で安全停止します。Home掲載対象と重複防止
Member WebはBloggerフィードを1回取得し、「みことばカード」と通常の支部記事をラベルで分けます。それぞれ直近7日以内の全件と支部ラベルごとの最新1件を選びます。カード側は選定した原記事URLをHome Snapshotへ保存し、iOS 1.20 build 248以降がギャラリーのsourceURLと正規化して照合します。「みことばカード」記事は通常の「各国支部のブログ」一覧へ入らないため二重表示しません。Bloggerにない固定のPasadena(本部)から架空の投稿は作りません。
削除は「次回また戻る」にしない
削除時は原記事URLのSHA-256だけを独立した非autoloadの削除記録として残し、公開APIにはhashだけを返します。意図的な復元は、自動同期とは別の承認済み本番データ操作として対象hashを指定して行います。
4. Davar Webの更新がiPhoneへ届くまで
Davar Web(www2.davarkg.com)は、教会の英語/日本語公式サイト、イベント、本部ブログ、ニュースレター、Church School情報の正本です。日本語・英語のStore公開商品APIもMember Webの収集元です。Davar Appがこれらを毎回直接読み取るのではなく、Member Web(d.cblh.us/members-home/)と同じWordPressが定期的に集約し、安定したアプリ用JSONへ変換します。
公式サイト更新 → 集約 → Home表示
www2.davarkg.comの英語/日本語サイトへ、投稿、固定ページ、イベント、ブログ、ニュースレターなどを掲載・更新します。sectionErrorsへ記録します。members-homeを更新すると同時に、アプリ用のdavar_ai_app_home_snapshotを保存します。GET /app/homeは外部サイトを再取得せず、この保存済みスナップショットを返します。GET /wp-json/davar/v1/app/home?lang=ja|enを呼びます。成功時は端末にも保存し、通信できないときは前回の内容を表示します。storeUpdatesはiPhone / iPadのHome末尾、Apple TVの更新ticker末尾に置き、項目を選ぶと商品URLを開きます。| Homeの区分 | 主なwww2取得元 | アプリでの動作 |
|---|---|---|
| アナウンスメント/Website更新情報 | 英語・日本語WordPressの投稿/固定ページREST API。更新日が31日以内のものを最大16件 | タイトルの言語タグで選択し、元ページを開く |
| イベント | The Events Calendar REST API | 開催日とタイトルを表示し、詳細ページを開く |
| ロスアンゼルス本部ブログ | /jp/blog/の公開HTML | 最新記事を表示し、元記事を開く |
| ニュースレター | 婦人/Youth・Juniorの公開HTML | アプリ内のNewsletter表示へ進む |
| Church School | 日本語WordPress REST APIと案内ページ | 英語設定では英語タイトル/案内URLへ置換 |
| Store新着入荷情報 | 日本語・英語Storeの公開商品API。31日以内・各言語最新8件 | 日英の言語タグで選択。iPhone / iPadの最終Home section、Apple TV tickerの最終カテゴリとして表示し、商品URLを開く。基準作成後の新商品は日次通知へ区分別件数と商品リンク付きで保存 |
5. 毎週の資料・動画更新
週次タスクは4つの原稿を一組として扱います。新しくダウンロードしたファイルだけを処理し、生成物、Web公開物、AI Knowledgeを同じ週にそろえます。
4資料 → 音声・動画 → Dropbox / Member Web
週報PDF 日/英
process_latest_and_update_web.py今回取得した新規ファイルだけを選択
日本語: Takumi neural
音声とspeech marksを生成
サイズ・ハッシュを確認
日本語はmembers-home、英語はアプリ専用
定期orchestratorは最新の4資料を一組として処理します。一方、基礎pipeline自体はPDF/DOCXを1件ずつ処理できます。YouTube upload機能もありますが既定値はoffで、週次処理の通常完了条件には含めません。
週報の読みやすいtext抽出はMember Webのmembers-home-auto.phpが担当し、pdftotextとOCR fallbackの結果をアプリがAPIから表示します。「聖日礼拝〜報告」「今週の暗誦聖句」「黒丸ごとのお知らせ」「その下の予定」「原PDF 3 page目の説教サマリー」を別blockにする構造化は次の改修として記録済みで、build 198の実装済み機能には含めません。
6. Davar AIへKnowledgeを登録するとき
4資料がDropboxへそろった後、rh10上でDropbox専用collectorを実行します。週次処理ではWeb全体を再収集する collect.py all は使いません。
Dropbox-only collector
collect.py dropbox がDropboxだけを一覧し、対象ファイルを取得します。davar-sermons / davar-info / davar-web / davar-archive
davar-sermons、davar-info、davar-web、davar-archive の4つです。commentaryは日次件数表の対象ですが、現在の3モデルへは関連付けられていません。7. Davar AIのcronが毎日巡回するとき
本番rh10では、サーバーのAmerica/Los_Angeles時刻で毎日02:00にrun_weekly_collect.shを実行します。ファイル名には歴史的にweeklyが残っていますが、現在の実行頻度は日次です。ここでいう「学習」は、収集した文章をKnowledgeへ追加・更新してRAGの検索対象を増やすことであり、ClaudeやOllamaのモデル重みを再訓練する処理ではありません。
日次巡回:収集元からKnowledge・索引・レポートまで
何を、どのように巡回するか
| Collector | 巡回元と取得内容 | 反映先 | 主な境界・安全策 |
|---|---|---|---|
rss | Davarの公式Podcast RSS 4系列からエピソードノートを取得 | davar-sermons | 音声は取得・文字起こししない。ローカル説教原稿とタイトル重複を除外 |
hc | davarkg.com/hc/のHouse Church学びの記録を内部リンクで巡回 | davar-sermons | 最大500ページ。一覧、タグ、著者、feed、削除済みなどのノイズURLを除外 |
sites | Davar Web、旧Davarサイト、davar.org、Jun Asai公式サイトと、davar.orgから確認できた関連ミニストリー | davar-info | ドメインごとに最大10,000ページ。管理画面、API、feed、Store経路を除外 |
store | store.davarkg.comとdavarkg.com/storejp/の商品一覧・紹介文 | davar-info | 最大400ページ。購入済み本文、download、cart、checkout、account、決済は巡回しない |
events | Davar WebのThe Events Calendar APIから今後の予定 | Davar AI 3モデルのsystem prompt | Knowledge文書にはしない。毎回マーカー区間だけ置換し、API失敗時は既存予定を変更しない |
web | Davar WebとJun Asai公式サイトのWordPress REST APIから固定ページ・投稿 | davar-web | 決済・アカウント・フォーム系slugを除外。全取得失敗時は現行Knowledgeを変更しない |
youtube | Davar Churchの現行・旧2チャンネル、指定archive playlistの字幕、Jun Asaiチャンネルの動画メタデータ | 字幕はdavar-sermons、Jun Asai情報はdavar-info | 通常は手動字幕のみ。指定playlistだけASRを許可し、字幕なしは記録してスキップ。Whisperは使わない |
discover | DuckDuckGoへ教会名・牧師名など5 queryを送り、第三者サイトの掲載情報を発見 | davar-info | 公式サイトへの参照、牧師名、Pasadena+教会語彙などの本人性filterを通過したページだけ |
dropbox | 設定済みDropbox共有folderを再帰一覧し、DOCX / PDFの説教Summary・週報を取得 | davar-sermons | Dropbox content hash、相対path、期待出力名で重複判定。OAuth失敗時は共有ZIP取得を試す |
inbox | /opt/davar-ai/inbox/へ正規に置かれたDOCX / PDF教材 | davar-sermons | 成功後はprocessed/へ移動。MP3は保管だけで文字起こししない |
1回のcronで行う処理
function_calling=legacyずれだけをbackup後に限定修復し、read-back失敗時はrollbackします。Knowledge欠落や一般障害は自動修復しません。collect.py allが10 collectorを4グループで巡回します。ポライト取得、Markdown正規化、SHA-256差分判定を行い、Open WebUIのupload・処理・関連付け成功後だけ台帳を更新します。davar-webで元ページが消えた場合も過去版保存後だけ現行Knowledgeから外します。未確認が20件超かつ取得済みの25%超なら部分障害として一括削除を停止します。davar-archiveへ再投入します。失敗時は既存索引を維持します。archive_memory.pyが削除/更新前のWeb文書をappend-onlyで保存します。stats_autolearn.pyが前日の質問を分類し、既知集約は決定的索引へ、新資料が必要なものだけpendingへ残します。daily_report.pyが収集、Knowledge件数、pending、backup鮮度、最初に実行したguardの状態をHTML/textメールへまとめます。collect.py dropboxだけを明示実行し、期待する4ファイルを1件ずつ確認します。日次cronのcollect.py allは広い情報源を追随する定常巡回で、同じDropbox collectorも含みます。doneだけでは全巡回成功を意味しません。メール、guard state、cron.logを確認します。2026-09-03の本番read-backでは、3モデル、5 canary、必須4 corpusが正常で、修復・error・連続失敗は0でした。8. デイリーメールは何を調べ、どう対応するか
daily_report.pyは日次巡回の最後に動き、件名[davar] デイリーレポート YYYY-MM-DDのHTML/テキストメールをローカルsendmailから送ります。件名の日付はメール生成日、本文の利用状況は原則として前日の質問です。02:00に開始した全処理の最後に送るため、配信時刻は巡回時間に応じて変わります。
調査 → メール生成 → 受信後の判断
cron.logでも確認します。 図を拡大メールを作るために何を調べているか
| メール欄 | 調査元・判定方法 | 報告内容 | 読み方の注意 |
|---|---|---|---|
| 利用サマリー | Member Webの保護された/qstatsから前日の質問ログを取得 | ユニーク利用者数、質問総数、重複を除いた質問数 | メールはユーザー別内訳を表示しない。ただし取得失敗が現在は0件表示に見える場合がある |
| 質問の仕分け | 質問文だけをHaikuで分類。失敗時は「一覧・件数・分布」などの語によるheuristic | 「うまく返せたと思う質問」と「事前学習候補」 | 回答本文を取得・採点していないため推定。実際の回答品質を保証しない |
| 自己改善ループ | 当日のstats_autolearn.jsonを読む | 自動生成した索引、既存索引の更新、新データが必要なpending | pendingは対応・解決登録まで毎日残る。単に通知を消すためにresolveしない |
| Knowledge件数 | Open WebUI SQLiteのKnowledgeと関連ファイルを数える | davar-sermons / info / web / archive / bible-kougo / commentaryの件数と合計 | 件数は存在確認であり、本文品質・検索品質・全collector成功を保証しない |
| curated docs | data/curated/*.mdのファイル数と見出しを読む | 事前計算済み索引・要約・集計docの件数 | 件数が同じでも内容更新はあり得る |
| 本日の収集 | 当日のcron.logから特定形式のcollector summaryとingest_records行を抽出 | 一部collectorのnew / changed / skipped、Knowledgeのadded / replaced / failed | ログ全体のエラー検索ではない。形式が違うRSS、YouTube、Dropbox等の結果や一般ERRORが表に出ない場合がある |
| 回答経路guard | atomicに保存したhealth stateと当日のguard結果を読む | 3モデル設定、5 canary、4 corpus、修復、直近error、連続失敗 | 支部・過去セミナー・Davar固有の聖書理解を含む保護対象の実回答経路を確認。異常時は失敗通知、復旧時は復旧通知を送る |
| バックアップ | last_backup_ok.jsonの成功時刻と保存先を現在時刻と比較 | 正常、成功マーカーなし、または既定48時間超の警告 | マーカーは最後の成功記録。保存物そのものの復元試験結果ではない |
| セキュリティ/patch | rh10のneeds-restartingとMember Web hostへのSSH読取 | 両hostの要再起動、WordPress plugin保留件数、直近image更新log | 「不明」は正常ではなく調査取得失敗。自動更新後も翌日残る場合は要確認 |
| API費用 | 質問数に固定の想定token数と参考単価を掛け、日別台帳から月合計を算出 | 当日・当月のSonnet/Haiku概算 | 実tokenと請求額ではない。傾向を見る値で、最終確認はprovider請求情報を使う |
メールを受け取ったら何を確認するか
cron.logの開始/done/メール送信完了、daily_report failed、mail queue、sendmail/Postfixを確認します。last_backup_ok.jsonを調べ、再実行後に新しい成功時刻と保存物を確認します。N/Aが普段と違わないか確認します。不自然な0件は「利用なし」と決めず、qstats認証・endpoint、Open WebUI DB接続、当日のcron実行を切り分けます。cron.logでERROR、WARN、errors=1以上、failed=1以上を検索します。異常sourceを直した後、そのcollectorだけを承認済み手順で再実行し、投入件数と失敗0件を確認します。stats_autolearn.py --resolve <ID>で通知を閉じます。cron.logの一部形式を要約したものです。メール受信だけで全collector成功とは判断せず、qstatsの不自然な0件も「利用なし」と決めません。guard stateと元logの両方を確認します。cron.logに未確認のERROR/WARN/正数failedがない、pendingに未判断項目がない、patch警告が残っていない、の順に確認します。9. ユーザーがBible AIへ質問したとき
「内部DBからClaudeへデータを渡す」という理解は概ね正しいですが、その役割を担うのはOllamaではなくOpen WebUIのローカルRAGです。全文DBを渡すのではなく、検索で選ばれた少数の本文断片だけをClaudeへ送ります。Open WebUI 0.11.0でbrowser sessionのないAPI質問にもKnowledgeを確実に挿入するため、本番3モデルはlegacy RAGを明示しています。
質問 → ローカル検索 → Claude → 回答
rh10内です。<source> として最後のユーザーメッセージへ挿入し、別メッセージのシステム指示と直近履歴を一緒にモデルへ渡します。[N]、スコア上位の根拠抜粋最大5件をアプリへ返します。一般的な聖書質問は通常回答としてHTTP 200で継続します。| 項目 | 稼働値 | 場所 |
|---|---|---|
| Open WebUI | 0.11.0、legacy RAGを明示 | rh10 |
| 埋め込み | BAAI/bge-m3 | ローカル |
| 検索 | BM25 0.5 + vector 0.5、top 8 | ローカル |
| reranker | BAAI/bge-reranker-v2-m3、top 6 | ローカル |
| チャンク | 800文字相当、overlap 100 | ローカル |
| 通常の回答モデル | claude-sonnet-4-6、temperature 0.3 | Anthropic |
Davar固有の回答
「Davar固有の回答(Davar資料・出典で確認済み)」と表示します。質問に関連する承認済みDavar資料・出典・抜粋を取得できない場合は、推測せずHTTP 503で停止します。
通常回答
「通常回答(Davar固有の教え・見解としては検証されていません)」と表示します。一般的な聖書の説明は利用できますが、Davar Church固有の教えを示すものではありません。
10. LiteLLMは何をしているか
LiteLLMは、Open WebUIとAnthropic Claudeの間に置かれた内部専用のモデルゲートウェイ兼変換アダプターです。Open WebUIはOpenAI互換形式でモデルを呼び出し、LiteLLMがそのリクエストをAnthropic形式へ変換してClaudeへ中継します。
Open WebUIとClaudeの「通訳・受付」
OpenAI互換リクエスト
:4000外部へポート公開なし
LiteLLMが行うこと
- 共通インターフェース:
/v1/modelsと/v1/chat/completionsのOpenAI互換APIをOpen WebUIへ提供します。 - モデルの振り分け:
claude-sonnet-4-6とclaude-haiku-4-5を対応するAnthropicモデルへマッピングします。 - パラメーターの正規化:Anthropicが受け付けないOpenAI/Ollama由来の項目を落とし、余分な入力によるHTTP 400を防ぎます。
- 認証の集約:Anthropicの認証情報を
rh10の実行環境だけに保持して、上流APIへ付与します。
LiteLLMが行わないこと
- Knowledgeの保存、文書分割、埋め込み生成
- BM25/Chroma検索やrerankerによる絞り込み
- どの本文断片をClaudeへ渡すかの判断
- Claude障害時のOllamaへの自動切り替え
| Open WebUI側 | 生成先 | 経路 |
|---|---|---|
| davar-bible-assistant-fast | claude-sonnet-4-6 | LiteLLM → Anthropic |
| davar-bible-assistant | claude-haiku-4-5 | LiteLLM → Anthropic |
| davar-bible-assistant-local | qwen3:8b | Ollamaへ直接(LiteLLMを通らない) |
11. Ollamaは何をしているか
通常のClaude経路
Open WebUI RAG → LiteLLM → Claude Sonnet 4.6
- 埋め込み、BM25、vector検索、rerankはOpen WebUI側
- Ollamaは検索にも、DBからClaudeへの受け渡しにも入らない
- アプリ/Webの現在の既定経路
ローカル回答モデル
同じOpen WebUI RAG → Ollama qwen3:8b
- davar-bible-assistant-localを選んだ場合に回答生成を担当
- Claudeを使わず、同じ選定済みRAG断片をローカルモデルへ渡す
- 手動/設定変更による代替経路
12. 外部連携台帳
外部の情報源、生成API、通知、配信、利用者が開くサービスを一つの台帳にまとめます。「自動でデータを交換する連携」と「リンクを開くだけの連携」は同じものとして扱いません。2026年9月3日に、Davar App、Member Web、Davar AI collector、週次処理、配布scriptの実装と運用記録を照合しました。
| 外部連携 | 方向と用途 | 送受信するもの | 失敗時・境界 |
|---|---|---|---|
Davar Webと教会運営sitedavarkg.com / www2.davarkg.com / youth.davarkg.com / davar.org / junasai.com / www2.junasai.com、確認済み関連ministry | Member WebとDavar AIが定期取得 | 公開記事、固定page、event、newsletter、Church School、公式情報 | 区分ごとの取得失敗を記録し、未確認内容を新しい事実として扱わない |
Blogger / Blogspotdavarjp.blogspot.comblogger.googleusercontent.com | 日本支部blog取得、定期import、認証済みアプリ投稿の作成・編集・削除・画像保管差し替え | 公開記事metadata、title/comment、label、投稿日、原記事URL、公開原画像 | 専用投稿者、immutable marker、記事ID、host、sourceURL、削除hash、原画像hash、mail間隔、書込後read-backを検証 |
| Dropbox API / 共有folder | 週次入出力、Davar AIのDropbox collector | 日英の説教Summary・週報、生成MP4 / SRT | 4入力、hash、公開URL、Knowledge登録を個別確認。AppはDropboxへ直接接続しない |
| iCloud Photos / OneDrive / Amazon Photos / Dropbox Transfer / Dropbox共有folder | Member Webが利用者指定の公開共有URLから教会写真・動画をserver側import | 選択前manifestと、利用者が確定した公開共有media | 公開HTTPS共有URLだけ。login/password必須共有は拒否し、provider障害時は端末uploadを案内 |
| YouTube | Appの最新動画RSS・再生、Davar AIの字幕/catalog収集 | 公開feed、playlist、動画metadata、利用可能な字幕 | 対象channel/playlistを固定。取得不能動画を成功扱いにせず、AppはWeb/YouTube appへfallback |
| DuckDuckGo / Davar Store | Davar AIの限定検索と商品情報collector | 公開検索結果、許可domainの公開商品説明 | 5つの固定queryと本人性/domain filterを通った情報だけを候補にする |
| AWS Polly / S3 | 週次処理と案内動画scriptから音声を生成 | 英語Ruth long-form、日本語Takumi neuralへ渡す原稿、合成音声、speech marks | 認証情報は実行環境だけに保持。task結果、生成、長さ、後続media変換を確認する |
| Anthropic Claude API | LiteLLM経由でBible AI回答と一部運用分類を生成 | 質問、直近履歴、system指示、検索で選ばれた断片 | Knowledge全文は送らない。Davar固有回答は関連資料をserverで再検証し、不足時はHTTP 503 |
| Apple Push Notification service (APNs) / Firebase Cloud Messaging (FCM) | Member WebからiOS/Androidへ管理者確認済み通知、またはLA時間午前8時の日次サイト更新を送信 | 端末登録識別子、2種類の購読選択、注文通知用の自己申告の所属支部ID、公開Inbox項目とchannelを指す最小通知payload | provider credentialはserverだけに保持。管理者/サイト更新の対象者をserverで分離し、公開と送信をidempotency keyで結ぶ。注文通知の予約対象は固定し、配信時点の所属支部との一致を判定。構成不足は503 |
| Vimeo / IBM Video | Appが既存の外部配信動画を表示または開く | 公開動画URLと再生要求 | 教会media原本の保存先ではない。provider別表示から安全な外部URLへ渡す |
コルネリオ会messages.davarkg.com | 利用者がMediaメニューから選んだ時だけ、固定された公開pageをApp内Web画面で表示 | 選択された公開HTTPS pageと通常のWeb request | background同期、Bible AI認証、Member Webへの内容取込は行わない。serverは許可済み組み込み識別子を送り、正確なURLはAppが保持する |
| Facebook / Instagram / Apple Maps / Google Maps / Amazonほか案内link | 利用者操作時だけ外部appまたはbrowserを開く | 選択された公開URL | background同期ではない。server配信文書は4つの許可root domainだけ、内蔵linkはAppに明示したURLだけを開く |
Zippopotam.usapi.zippopotam.us/us/{ZIP} | Member Webで米国ZIPから会員間のおおよその近さを計算 | 米国ZIP codeだけを送信し、緯度・経度を受信 | 氏名、住所、member IDは送信しない。API失敗時は距離情報を使わない |
| Bible本文・学習資料の配布元/出典link eKotoba、BibleEngine、OpenScriptures、Hebrew Wikisource、First1KGreek、Byzantine Majority Text、eBible.org、STEPBible、CrossWire、Bible Researcher | build時に同梱databaseを作成。利用者操作時に出典linkを開く | 公開聖書本文、原語tag、辞書・注解・引照・節番号対応・出典URL | runtime自動同期ではない。ライセンスと既知の欠落をApp内に表示し、利用者のメモ等は送らない |
| Apple App Store / App Store Connect | iOS・tvOS build、metadata、screenshot、TestFlight/公開配布 | 署名済みbuildとstore情報 | runtime content経路とは分離。TestFlight内部配布とApp Review/公開は別gateでread-back確認する |
| Cloudflare edge | software.jly.me/software.cblh.us等の公開入口 | TLS Web requestとcache可能な公開静的content | 技術資料と図は認証後もprivate, no-store。公開後はHTTP 200だけでなく両hostのhashを照合 |
| 運用・注文送信email | local Postfix/sendmailの日次reportとserver生成の注文メール | 集約監視情報・対応可能error、または管理者指定To/Ccへ送る日英注文内容 | credential・Knowledge全文は送らない。注文宛先は管理者設定とし、送信内容と履歴を監査する |
iOS 1.20 build 242以降:Member Webは設定済み2チャンネルの公開YouTube Atom feedと、日本語・英語のStore公開商品APIから新着を収集します。更新ページ、動画、みことばカード、Store商品のタイトルとURLを日次お知らせに固定保存し、Pushは区分別件数の要約と参照IDだけを送ります。利用者は通知→詳細→正確な公開ページ・動画・商品へ進めます。YouTubeとStoreは初回の正常取得を静かな基準作成とし、取得失敗時は以前の基準を保持します。Storeは言語ごとの最新公開日と同日のURL集合をwatermarkとして管理し、Store取得エラーがある回は両言語の基準を進めません。Instagram・Facebook・Xの自動収集は公式API接続待ちです。期限未設定のお知らせは公開30日後に期限切れとなり、注文自体は削除しません。
13. 保存場所と外部へ出るデータ
データの境界
Knowledge全文、チャンク、埋め込み
週次データの正本と配布先
- Dropbox:週次入力とMP4 / SRT生成物
- Member Web:アプリ/members-home向けPDF / MP4 / VTT
- Member Web:みことばカードの投稿日、無変換の原画像、一覧用縮小PNG、原記事の
sourceURL、削除URLのhash - Member Web Private領域:教会写真・動画の原本、撮影日folder、公開状態とevent tag metadata
- ローカルMac:処理中ファイルと完了後アーカイブ
AI検索用ストア
- Open WebUI SQLite:ファイル、Knowledge、モデルの関連
- Chroma:検索用チャンクと埋め込みベクトル
- Claude:問い合わせごとに選ばれたコンテキストだけを処理
DavarBible.sqliteと利用者のhighlight・note・検索履歴は端末内です。Bible AIを使った質問だけがMember Web、Davar AI、選択した回答modelへ送られます。