feat(dimentorin): AI agent RAG (embedding materi -> Qdrant + chat via 9router)

- ENV: AI_LLM_BASE_URL/API_KEY/MODEL, AI_EMBEDDING_MODEL (gemini-embedding-001), QDRANT_URL
- ai_agent module: chunking materi, embed_text + chat_completion (9router, SSE parse), Qdrant repo (dimentorin_materi collection, 3072d cosine)
- routes: POST /ai/chat (RAG answer + sources), POST /ai/materials/{id}/index, POST /ai/reindex
- e2e verified: reindex 3 chunks; chat 'ownership' -> materi Rust paling relevan 0.88; chat 'endpoint axum' -> materi Axum 0.82; jawaban gronding konteks
This commit is contained in:
asepharyana
2026-08-05 17:15:11 +07:00
parent ac8177d87e
commit 164c1860da
18 changed files with 741 additions and 3 deletions
+24
View File
@@ -37,6 +37,11 @@ pub struct Env {
pub midtrans_merchant_id: String,
pub midtrans_client_key: String,
pub midtrans_server_key: String,
pub ai_llm_base_url: String,
pub ai_llm_api_key: String,
pub ai_llm_model: String,
pub ai_embedding_model: String,
pub qdrant_url: String,
pub cors_allowed_origins: Vec<String>,
}
@@ -79,6 +84,11 @@ impl std::fmt::Debug for Env {
.field("midtrans_merchant_id", &self.midtrans_merchant_id)
.field("midtrans_client_key", &"***")
.field("midtrans_server_key", &"***")
.field("ai_llm_base_url", &self.ai_llm_base_url)
.field("ai_llm_api_key", &"***")
.field("ai_llm_model", &self.ai_llm_model)
.field("ai_embedding_model", &self.ai_embedding_model)
.field("qdrant_url", &self.qdrant_url)
.field("cors_allowed_origins", &self.cors_allowed_origins)
.finish()
}
@@ -207,6 +217,20 @@ pub static ENV: Lazy<Env> = Lazy::new(|| {
midtrans_merchant_id: get_env_with_warning("MIDTRANS_MERCHANT_ID", ""),
midtrans_client_key: get_env_with_warning("MIDTRANS_CLIENT_KEY", ""),
midtrans_server_key: get_env_with_warning("MIDTRANS_SERVER_KEY", ""),
ai_llm_base_url: get_env_with_warning(
"AI_LLM_BASE_URL",
"https://9router.asepharyana.my.id/v1",
),
ai_llm_api_key: get_env_with_warning("AI_LLM_API_KEY", ""),
ai_llm_model: get_env_with_warning("AI_LLM_MODEL", "text"),
ai_embedding_model: get_env_with_warning(
"AI_EMBEDDING_MODEL",
"gemini/gemini-embedding-001",
),
qdrant_url: get_env_with_warning(
"QDRANT_URL",
"http://100.121.180.82:6333",
),
cors_allowed_origins: get_env_with_warning(
"CORS_ALLOWED_ORIGINS",
"https://gacha.imphnen.dev,https://imphnen.dev,https://dimentorin.imphnen.dev,https://backoffice.imphnen.dev,https://hackathon.imphnen.dev,https://qr.imphnen.dev,https://infra.imphnen.dev",