Merge branch 'plugins/beta' into dev/plugin-deploy
commit
1097bf314a
@ -0,0 +1,54 @@
|
|||||||
|
from werkzeug.exceptions import NotFound
|
||||||
|
|
||||||
|
from controllers.service_api import api
|
||||||
|
from controllers.service_api.wraps import (
|
||||||
|
DatasetApiResource,
|
||||||
|
)
|
||||||
|
from core.file import helpers as file_helpers
|
||||||
|
from extensions.ext_database import db
|
||||||
|
from models.dataset import Dataset
|
||||||
|
from models.model import UploadFile
|
||||||
|
from services.dataset_service import DocumentService
|
||||||
|
|
||||||
|
|
||||||
|
class UploadFileApi(DatasetApiResource):
|
||||||
|
def get(self, tenant_id, dataset_id, document_id):
|
||||||
|
"""Get upload file."""
|
||||||
|
# check dataset
|
||||||
|
dataset_id = str(dataset_id)
|
||||||
|
tenant_id = str(tenant_id)
|
||||||
|
dataset = db.session.query(Dataset).filter(Dataset.tenant_id == tenant_id, Dataset.id == dataset_id).first()
|
||||||
|
if not dataset:
|
||||||
|
raise NotFound("Dataset not found.")
|
||||||
|
# check document
|
||||||
|
document_id = str(document_id)
|
||||||
|
document = DocumentService.get_document(dataset.id, document_id)
|
||||||
|
if not document:
|
||||||
|
raise NotFound("Document not found.")
|
||||||
|
# check upload file
|
||||||
|
if document.data_source_type != "upload_file":
|
||||||
|
raise ValueError(f"Document data source type ({document.data_source_type}) is not upload_file.")
|
||||||
|
data_source_info = document.data_source_info_dict
|
||||||
|
if data_source_info and "upload_file_id" in data_source_info:
|
||||||
|
file_id = data_source_info["upload_file_id"]
|
||||||
|
upload_file = db.session.query(UploadFile).filter(UploadFile.id == file_id).first()
|
||||||
|
if not upload_file:
|
||||||
|
raise NotFound("UploadFile not found.")
|
||||||
|
else:
|
||||||
|
raise ValueError("Upload file id not found in document data source info.")
|
||||||
|
|
||||||
|
url = file_helpers.get_signed_file_url(upload_file_id=upload_file.id)
|
||||||
|
return {
|
||||||
|
"id": upload_file.id,
|
||||||
|
"name": upload_file.name,
|
||||||
|
"size": upload_file.size,
|
||||||
|
"extension": upload_file.extension,
|
||||||
|
"url": url,
|
||||||
|
"download_url": f"{url}&as_attachment=true",
|
||||||
|
"mime_type": upload_file.mime_type,
|
||||||
|
"created_by": upload_file.created_by,
|
||||||
|
"created_at": upload_file.created_at.timestamp(),
|
||||||
|
}, 200
|
||||||
|
|
||||||
|
|
||||||
|
api.add_resource(UploadFileApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/upload-file")
|
||||||
@ -1,42 +0,0 @@
|
|||||||
model: ernie-lite-pro-128k
|
|
||||||
label:
|
|
||||||
en_US: Ernie-Lite-Pro-128K
|
|
||||||
model_type: llm
|
|
||||||
features:
|
|
||||||
- agent-thought
|
|
||||||
model_properties:
|
|
||||||
mode: chat
|
|
||||||
context_size: 128000
|
|
||||||
parameter_rules:
|
|
||||||
- name: temperature
|
|
||||||
use_template: temperature
|
|
||||||
min: 0.1
|
|
||||||
max: 1.0
|
|
||||||
default: 0.8
|
|
||||||
- name: top_p
|
|
||||||
use_template: top_p
|
|
||||||
- name: min_output_tokens
|
|
||||||
label:
|
|
||||||
en_US: "Min Output Tokens"
|
|
||||||
zh_Hans: "最小输出Token数"
|
|
||||||
use_template: max_tokens
|
|
||||||
min: 2
|
|
||||||
max: 2048
|
|
||||||
help:
|
|
||||||
zh_Hans: 指定模型最小输出token数
|
|
||||||
en_US: Specifies the lower limit on the length of generated results.
|
|
||||||
- name: max_output_tokens
|
|
||||||
label:
|
|
||||||
en_US: "Max Output Tokens"
|
|
||||||
zh_Hans: "最大输出Token数"
|
|
||||||
use_template: max_tokens
|
|
||||||
min: 2
|
|
||||||
max: 2048
|
|
||||||
default: 2048
|
|
||||||
help:
|
|
||||||
zh_Hans: 指定模型最大输出token数
|
|
||||||
en_US: Specifies the upper limit on the length of generated results. If the generated results are truncated, you can increase this parameter.
|
|
||||||
- name: presence_penalty
|
|
||||||
use_template: presence_penalty
|
|
||||||
- name: frequency_penalty
|
|
||||||
use_template: frequency_penalty
|
|
||||||
@ -0,0 +1,469 @@
|
|||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from typing import Optional, cast
|
||||||
|
|
||||||
|
from opik import Opik, Trace
|
||||||
|
from opik.id_helpers import uuid4_to_uuid7
|
||||||
|
|
||||||
|
from core.ops.base_trace_instance import BaseTraceInstance
|
||||||
|
from core.ops.entities.config_entity import OpikConfig
|
||||||
|
from core.ops.entities.trace_entity import (
|
||||||
|
BaseTraceInfo,
|
||||||
|
DatasetRetrievalTraceInfo,
|
||||||
|
GenerateNameTraceInfo,
|
||||||
|
MessageTraceInfo,
|
||||||
|
ModerationTraceInfo,
|
||||||
|
SuggestedQuestionTraceInfo,
|
||||||
|
ToolTraceInfo,
|
||||||
|
TraceTaskName,
|
||||||
|
WorkflowTraceInfo,
|
||||||
|
)
|
||||||
|
from extensions.ext_database import db
|
||||||
|
from models.model import EndUser, MessageFile
|
||||||
|
from models.workflow import WorkflowNodeExecution
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def wrap_dict(key_name, data):
|
||||||
|
"""Make sure that the input data is a dict"""
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
return {key_name: data}
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def wrap_metadata(metadata, **kwargs):
|
||||||
|
"""Add common metatada to all Traces and Spans"""
|
||||||
|
metadata["created_from"] = "dify"
|
||||||
|
|
||||||
|
metadata.update(kwargs)
|
||||||
|
|
||||||
|
return metadata
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_opik_uuid(user_datetime: Optional[datetime], user_uuid: Optional[str]):
|
||||||
|
"""Opik needs UUIDv7 while Dify uses UUIDv4 for identifier of most
|
||||||
|
messages and objects. The type-hints of BaseTraceInfo indicates that
|
||||||
|
objects start_time and message_id could be null which means we cannot map
|
||||||
|
it to a UUIDv7. Given that we have no way to identify that object
|
||||||
|
uniquely, generate a new random one UUIDv7 in that case.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if user_datetime is None:
|
||||||
|
user_datetime = datetime.now()
|
||||||
|
|
||||||
|
if user_uuid is None:
|
||||||
|
user_uuid = str(uuid.uuid4())
|
||||||
|
|
||||||
|
return uuid4_to_uuid7(user_datetime, user_uuid)
|
||||||
|
|
||||||
|
|
||||||
|
class OpikDataTrace(BaseTraceInstance):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
opik_config: OpikConfig,
|
||||||
|
):
|
||||||
|
super().__init__(opik_config)
|
||||||
|
self.opik_client = Opik(
|
||||||
|
project_name=opik_config.project,
|
||||||
|
workspace=opik_config.workspace,
|
||||||
|
host=opik_config.url,
|
||||||
|
api_key=opik_config.api_key,
|
||||||
|
)
|
||||||
|
self.project = opik_config.project
|
||||||
|
self.file_base_url = os.getenv("FILES_URL", "http://127.0.0.1:5001")
|
||||||
|
|
||||||
|
def trace(self, trace_info: BaseTraceInfo):
|
||||||
|
if isinstance(trace_info, WorkflowTraceInfo):
|
||||||
|
self.workflow_trace(trace_info)
|
||||||
|
if isinstance(trace_info, MessageTraceInfo):
|
||||||
|
self.message_trace(trace_info)
|
||||||
|
if isinstance(trace_info, ModerationTraceInfo):
|
||||||
|
self.moderation_trace(trace_info)
|
||||||
|
if isinstance(trace_info, SuggestedQuestionTraceInfo):
|
||||||
|
self.suggested_question_trace(trace_info)
|
||||||
|
if isinstance(trace_info, DatasetRetrievalTraceInfo):
|
||||||
|
self.dataset_retrieval_trace(trace_info)
|
||||||
|
if isinstance(trace_info, ToolTraceInfo):
|
||||||
|
self.tool_trace(trace_info)
|
||||||
|
if isinstance(trace_info, GenerateNameTraceInfo):
|
||||||
|
self.generate_name_trace(trace_info)
|
||||||
|
|
||||||
|
def workflow_trace(self, trace_info: WorkflowTraceInfo):
|
||||||
|
dify_trace_id = trace_info.workflow_run_id
|
||||||
|
opik_trace_id = prepare_opik_uuid(trace_info.start_time, dify_trace_id)
|
||||||
|
workflow_metadata = wrap_metadata(
|
||||||
|
trace_info.metadata, message_id=trace_info.message_id, workflow_app_log_id=trace_info.workflow_app_log_id
|
||||||
|
)
|
||||||
|
root_span_id = None
|
||||||
|
|
||||||
|
if trace_info.message_id:
|
||||||
|
dify_trace_id = trace_info.message_id
|
||||||
|
opik_trace_id = prepare_opik_uuid(trace_info.start_time, dify_trace_id)
|
||||||
|
|
||||||
|
trace_data = {
|
||||||
|
"id": opik_trace_id,
|
||||||
|
"name": TraceTaskName.MESSAGE_TRACE.value,
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": workflow_metadata,
|
||||||
|
"input": wrap_dict("input", trace_info.workflow_run_inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.workflow_run_outputs),
|
||||||
|
"tags": ["message", "workflow"],
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
self.add_trace(trace_data)
|
||||||
|
|
||||||
|
root_span_id = prepare_opik_uuid(trace_info.start_time, trace_info.workflow_run_id)
|
||||||
|
span_data = {
|
||||||
|
"id": root_span_id,
|
||||||
|
"parent_span_id": None,
|
||||||
|
"trace_id": opik_trace_id,
|
||||||
|
"name": TraceTaskName.WORKFLOW_TRACE.value,
|
||||||
|
"input": wrap_dict("input", trace_info.workflow_run_inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.workflow_run_outputs),
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": workflow_metadata,
|
||||||
|
"tags": ["workflow"],
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
self.add_span(span_data)
|
||||||
|
else:
|
||||||
|
trace_data = {
|
||||||
|
"id": opik_trace_id,
|
||||||
|
"name": TraceTaskName.MESSAGE_TRACE.value,
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": workflow_metadata,
|
||||||
|
"input": wrap_dict("input", trace_info.workflow_run_inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.workflow_run_outputs),
|
||||||
|
"tags": ["workflow"],
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
self.add_trace(trace_data)
|
||||||
|
|
||||||
|
# through workflow_run_id get all_nodes_execution
|
||||||
|
workflow_nodes_execution_id_records = (
|
||||||
|
db.session.query(WorkflowNodeExecution.id)
|
||||||
|
.filter(WorkflowNodeExecution.workflow_run_id == trace_info.workflow_run_id)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
for node_execution_id_record in workflow_nodes_execution_id_records:
|
||||||
|
node_execution = (
|
||||||
|
db.session.query(
|
||||||
|
WorkflowNodeExecution.id,
|
||||||
|
WorkflowNodeExecution.tenant_id,
|
||||||
|
WorkflowNodeExecution.app_id,
|
||||||
|
WorkflowNodeExecution.title,
|
||||||
|
WorkflowNodeExecution.node_type,
|
||||||
|
WorkflowNodeExecution.status,
|
||||||
|
WorkflowNodeExecution.inputs,
|
||||||
|
WorkflowNodeExecution.outputs,
|
||||||
|
WorkflowNodeExecution.created_at,
|
||||||
|
WorkflowNodeExecution.elapsed_time,
|
||||||
|
WorkflowNodeExecution.process_data,
|
||||||
|
WorkflowNodeExecution.execution_metadata,
|
||||||
|
)
|
||||||
|
.filter(WorkflowNodeExecution.id == node_execution_id_record.id)
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
|
||||||
|
if not node_execution:
|
||||||
|
continue
|
||||||
|
|
||||||
|
node_execution_id = node_execution.id
|
||||||
|
tenant_id = node_execution.tenant_id
|
||||||
|
app_id = node_execution.app_id
|
||||||
|
node_name = node_execution.title
|
||||||
|
node_type = node_execution.node_type
|
||||||
|
status = node_execution.status
|
||||||
|
if node_type == "llm":
|
||||||
|
inputs = (
|
||||||
|
json.loads(node_execution.process_data).get("prompts", {}) if node_execution.process_data else {}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
inputs = json.loads(node_execution.inputs) if node_execution.inputs else {}
|
||||||
|
outputs = json.loads(node_execution.outputs) if node_execution.outputs else {}
|
||||||
|
created_at = node_execution.created_at or datetime.now()
|
||||||
|
elapsed_time = node_execution.elapsed_time
|
||||||
|
finished_at = created_at + timedelta(seconds=elapsed_time)
|
||||||
|
|
||||||
|
execution_metadata = (
|
||||||
|
json.loads(node_execution.execution_metadata) if node_execution.execution_metadata else {}
|
||||||
|
)
|
||||||
|
metadata = execution_metadata.copy()
|
||||||
|
metadata.update(
|
||||||
|
{
|
||||||
|
"workflow_run_id": trace_info.workflow_run_id,
|
||||||
|
"node_execution_id": node_execution_id,
|
||||||
|
"tenant_id": tenant_id,
|
||||||
|
"app_id": app_id,
|
||||||
|
"app_name": node_name,
|
||||||
|
"node_type": node_type,
|
||||||
|
"status": status,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
process_data = json.loads(node_execution.process_data) if node_execution.process_data else {}
|
||||||
|
|
||||||
|
provider = None
|
||||||
|
model = None
|
||||||
|
total_tokens = 0
|
||||||
|
completion_tokens = 0
|
||||||
|
prompt_tokens = 0
|
||||||
|
|
||||||
|
if process_data and process_data.get("model_mode") == "chat":
|
||||||
|
run_type = "llm"
|
||||||
|
provider = process_data.get("model_provider", None)
|
||||||
|
model = process_data.get("model_name", "")
|
||||||
|
metadata.update(
|
||||||
|
{
|
||||||
|
"ls_provider": provider,
|
||||||
|
"ls_model_name": model,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if outputs.get("usage"):
|
||||||
|
total_tokens = outputs["usage"].get("total_tokens", 0)
|
||||||
|
prompt_tokens = outputs["usage"].get("prompt_tokens", 0)
|
||||||
|
completion_tokens = outputs["usage"].get("completion_tokens", 0)
|
||||||
|
except Exception:
|
||||||
|
logger.error("Failed to extract usage", exc_info=True)
|
||||||
|
|
||||||
|
else:
|
||||||
|
run_type = "tool"
|
||||||
|
|
||||||
|
parent_span_id = trace_info.workflow_app_log_id or trace_info.workflow_run_id
|
||||||
|
|
||||||
|
if not total_tokens:
|
||||||
|
total_tokens = execution_metadata.get("total_tokens", 0)
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": opik_trace_id,
|
||||||
|
"id": prepare_opik_uuid(created_at, node_execution_id),
|
||||||
|
"parent_span_id": prepare_opik_uuid(trace_info.start_time, parent_span_id),
|
||||||
|
"name": node_type,
|
||||||
|
"type": run_type,
|
||||||
|
"start_time": created_at,
|
||||||
|
"end_time": finished_at,
|
||||||
|
"metadata": wrap_metadata(metadata),
|
||||||
|
"input": wrap_dict("input", inputs),
|
||||||
|
"output": wrap_dict("output", outputs),
|
||||||
|
"tags": ["node_execution"],
|
||||||
|
"project_name": self.project,
|
||||||
|
"usage": {
|
||||||
|
"total_tokens": total_tokens,
|
||||||
|
"completion_tokens": completion_tokens,
|
||||||
|
"prompt_tokens": prompt_tokens,
|
||||||
|
},
|
||||||
|
"model": model,
|
||||||
|
"provider": provider,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def message_trace(self, trace_info: MessageTraceInfo):
|
||||||
|
# get message file data
|
||||||
|
file_list = cast(list[str], trace_info.file_list) or []
|
||||||
|
message_file_data: Optional[MessageFile] = trace_info.message_file_data
|
||||||
|
|
||||||
|
if message_file_data is not None:
|
||||||
|
file_url = f"{self.file_base_url}/{message_file_data.url}" if message_file_data else ""
|
||||||
|
file_list.append(file_url)
|
||||||
|
|
||||||
|
message_data = trace_info.message_data
|
||||||
|
if message_data is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
metadata = trace_info.metadata
|
||||||
|
message_id = trace_info.message_id
|
||||||
|
|
||||||
|
user_id = message_data.from_account_id
|
||||||
|
metadata["user_id"] = user_id
|
||||||
|
metadata["file_list"] = file_list
|
||||||
|
|
||||||
|
if message_data.from_end_user_id:
|
||||||
|
end_user_data: Optional[EndUser] = (
|
||||||
|
db.session.query(EndUser).filter(EndUser.id == message_data.from_end_user_id).first()
|
||||||
|
)
|
||||||
|
if end_user_data is not None:
|
||||||
|
end_user_id = end_user_data.session_id
|
||||||
|
metadata["end_user_id"] = end_user_id
|
||||||
|
|
||||||
|
trace_data = {
|
||||||
|
"id": prepare_opik_uuid(trace_info.start_time, message_id),
|
||||||
|
"name": TraceTaskName.MESSAGE_TRACE.value,
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": wrap_metadata(metadata),
|
||||||
|
"input": trace_info.inputs,
|
||||||
|
"output": message_data.answer,
|
||||||
|
"tags": ["message", str(trace_info.conversation_mode)],
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
trace = self.add_trace(trace_data)
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": trace.id,
|
||||||
|
"name": "llm",
|
||||||
|
"type": "llm",
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": wrap_metadata(metadata),
|
||||||
|
"input": {"input": trace_info.inputs},
|
||||||
|
"output": {"output": message_data.answer},
|
||||||
|
"tags": ["llm", str(trace_info.conversation_mode)],
|
||||||
|
"usage": {
|
||||||
|
"completion_tokens": trace_info.answer_tokens,
|
||||||
|
"prompt_tokens": trace_info.message_tokens,
|
||||||
|
"total_tokens": trace_info.total_tokens,
|
||||||
|
},
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def moderation_trace(self, trace_info: ModerationTraceInfo):
|
||||||
|
if trace_info.message_data is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
start_time = trace_info.start_time or trace_info.message_data.created_at
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": prepare_opik_uuid(start_time, trace_info.message_id),
|
||||||
|
"name": TraceTaskName.MODERATION_TRACE.value,
|
||||||
|
"type": "tool",
|
||||||
|
"start_time": start_time,
|
||||||
|
"end_time": trace_info.end_time or trace_info.message_data.updated_at,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": wrap_dict("input", trace_info.inputs),
|
||||||
|
"output": {
|
||||||
|
"action": trace_info.action,
|
||||||
|
"flagged": trace_info.flagged,
|
||||||
|
"preset_response": trace_info.preset_response,
|
||||||
|
"inputs": trace_info.inputs,
|
||||||
|
},
|
||||||
|
"tags": ["moderation"],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def suggested_question_trace(self, trace_info: SuggestedQuestionTraceInfo):
|
||||||
|
message_data = trace_info.message_data
|
||||||
|
if message_data is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
start_time = trace_info.start_time or message_data.created_at
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": prepare_opik_uuid(start_time, trace_info.message_id),
|
||||||
|
"name": TraceTaskName.SUGGESTED_QUESTION_TRACE.value,
|
||||||
|
"type": "tool",
|
||||||
|
"start_time": start_time,
|
||||||
|
"end_time": trace_info.end_time or message_data.updated_at,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": wrap_dict("input", trace_info.inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.suggested_question),
|
||||||
|
"tags": ["suggested_question"],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def dataset_retrieval_trace(self, trace_info: DatasetRetrievalTraceInfo):
|
||||||
|
if trace_info.message_data is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
start_time = trace_info.start_time or trace_info.message_data.created_at
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": prepare_opik_uuid(start_time, trace_info.message_id),
|
||||||
|
"name": TraceTaskName.DATASET_RETRIEVAL_TRACE.value,
|
||||||
|
"type": "tool",
|
||||||
|
"start_time": start_time,
|
||||||
|
"end_time": trace_info.end_time or trace_info.message_data.updated_at,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": wrap_dict("input", trace_info.inputs),
|
||||||
|
"output": {"documents": trace_info.documents},
|
||||||
|
"tags": ["dataset_retrieval"],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def tool_trace(self, trace_info: ToolTraceInfo):
|
||||||
|
span_data = {
|
||||||
|
"trace_id": prepare_opik_uuid(trace_info.start_time, trace_info.message_id),
|
||||||
|
"name": trace_info.tool_name,
|
||||||
|
"type": "tool",
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": wrap_dict("input", trace_info.tool_inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.tool_outputs),
|
||||||
|
"tags": ["tool", trace_info.tool_name],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def generate_name_trace(self, trace_info: GenerateNameTraceInfo):
|
||||||
|
trace_data = {
|
||||||
|
"id": prepare_opik_uuid(trace_info.start_time, trace_info.message_id),
|
||||||
|
"name": TraceTaskName.GENERATE_NAME_TRACE.value,
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": trace_info.inputs,
|
||||||
|
"output": trace_info.outputs,
|
||||||
|
"tags": ["generate_name"],
|
||||||
|
"project_name": self.project,
|
||||||
|
}
|
||||||
|
|
||||||
|
trace = self.add_trace(trace_data)
|
||||||
|
|
||||||
|
span_data = {
|
||||||
|
"trace_id": trace.id,
|
||||||
|
"name": TraceTaskName.GENERATE_NAME_TRACE.value,
|
||||||
|
"start_time": trace_info.start_time,
|
||||||
|
"end_time": trace_info.end_time,
|
||||||
|
"metadata": wrap_metadata(trace_info.metadata),
|
||||||
|
"input": wrap_dict("input", trace_info.inputs),
|
||||||
|
"output": wrap_dict("output", trace_info.outputs),
|
||||||
|
"tags": ["generate_name"],
|
||||||
|
}
|
||||||
|
|
||||||
|
self.add_span(span_data)
|
||||||
|
|
||||||
|
def add_trace(self, opik_trace_data: dict) -> Trace:
|
||||||
|
try:
|
||||||
|
trace = self.opik_client.trace(**opik_trace_data)
|
||||||
|
logger.debug("Opik Trace created successfully")
|
||||||
|
return trace
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"Opik Failed to create trace: {str(e)}")
|
||||||
|
|
||||||
|
def add_span(self, opik_span_data: dict):
|
||||||
|
try:
|
||||||
|
self.opik_client.span(**opik_span_data)
|
||||||
|
logger.debug("Opik Span created successfully")
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"Opik Failed to create span: {str(e)}")
|
||||||
|
|
||||||
|
def api_check(self):
|
||||||
|
try:
|
||||||
|
self.opik_client.auth_check()
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logger.info(f"Opik API check failed: {str(e)}", exc_info=True)
|
||||||
|
raise ValueError(f"Opik API check failed: {str(e)}")
|
||||||
|
|
||||||
|
def get_project_url(self):
|
||||||
|
try:
|
||||||
|
return self.opik_client.get_project_url(project_name=self.project)
|
||||||
|
except Exception as e:
|
||||||
|
logger.info(f"Opik get run url failed: {str(e)}", exc_info=True)
|
||||||
|
raise ValueError(f"Opik get run url failed: {str(e)}")
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,13 +0,0 @@
|
|||||||
services:
|
|
||||||
# Chroma vector store.
|
|
||||||
chroma:
|
|
||||||
image: ghcr.io/chroma-core/chroma:0.5.20
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./volumes/chroma:/chroma/chroma
|
|
||||||
environment:
|
|
||||||
CHROMA_SERVER_AUTHN_CREDENTIALS: difyai123456
|
|
||||||
CHROMA_SERVER_AUTHN_PROVIDER: chromadb.auth.token_authn.TokenAuthenticationServerProvider
|
|
||||||
IS_PERSISTENT: TRUE
|
|
||||||
ports:
|
|
||||||
- "8000:8000"
|
|
||||||
@ -1,109 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
services:
|
|
||||||
# The postgres database.
|
|
||||||
db:
|
|
||||||
image: postgres:15-alpine
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
# The password for the default postgres user.
|
|
||||||
POSTGRES_PASSWORD: difyai123456
|
|
||||||
# The name of the default postgres database.
|
|
||||||
POSTGRES_DB: dify
|
|
||||||
# postgres data directory
|
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
|
||||||
volumes:
|
|
||||||
- ./volumes/db/data:/var/lib/postgresql/data
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
# The redis cache.
|
|
||||||
redis:
|
|
||||||
image: redis:6-alpine
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
# Mount the redis data directory to the container.
|
|
||||||
- ./volumes/redis/data:/data
|
|
||||||
# Set the redis password when startup redis server.
|
|
||||||
command: redis-server --requirepass difyai123456
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
# The Weaviate vector store.
|
|
||||||
weaviate:
|
|
||||||
image: semitechnologies/weaviate:1.19.0
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
# Mount the Weaviate data directory to the container.
|
|
||||||
- ./volumes/weaviate:/var/lib/weaviate
|
|
||||||
environment:
|
|
||||||
# The Weaviate configurations
|
|
||||||
# You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information.
|
|
||||||
QUERY_DEFAULTS_LIMIT: 25
|
|
||||||
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
|
|
||||||
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
|
|
||||||
DEFAULT_VECTORIZER_MODULE: 'none'
|
|
||||||
CLUSTER_HOSTNAME: 'node1'
|
|
||||||
AUTHENTICATION_APIKEY_ENABLED: 'true'
|
|
||||||
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'
|
|
||||||
AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai'
|
|
||||||
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
|
|
||||||
AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai'
|
|
||||||
ports:
|
|
||||||
- "8080:8080"
|
|
||||||
|
|
||||||
# The DifySandbox
|
|
||||||
sandbox:
|
|
||||||
image: langgenius/dify-sandbox:0.2.1
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
# The DifySandbox configurations
|
|
||||||
# Make sure you are changing this key for your deployment with a strong key.
|
|
||||||
# You can generate a strong key using `openssl rand -base64 42`.
|
|
||||||
API_KEY: dify-sandbox
|
|
||||||
GIN_MODE: 'release'
|
|
||||||
WORKER_TIMEOUT: 15
|
|
||||||
ENABLE_NETWORK: 'true'
|
|
||||||
HTTP_PROXY: 'http://ssrf_proxy:3128'
|
|
||||||
HTTPS_PROXY: 'http://ssrf_proxy:3128'
|
|
||||||
SANDBOX_PORT: 8194
|
|
||||||
volumes:
|
|
||||||
- ./volumes/sandbox/dependencies:/dependencies
|
|
||||||
networks:
|
|
||||||
- ssrf_proxy_network
|
|
||||||
|
|
||||||
# ssrf_proxy server
|
|
||||||
# for more information, please refer to
|
|
||||||
# https://docs.dify.ai/learn-more/faq/install-faq#id-18.-why-is-ssrf_proxy-needed
|
|
||||||
ssrf_proxy:
|
|
||||||
image: ubuntu/squid:latest
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- "3128:3128"
|
|
||||||
- "8194:8194"
|
|
||||||
volumes:
|
|
||||||
# pls clearly modify the squid.conf file to fit your network environment.
|
|
||||||
- ./volumes/ssrf_proxy/squid.conf:/etc/squid/squid.conf
|
|
||||||
networks:
|
|
||||||
- ssrf_proxy_network
|
|
||||||
- default
|
|
||||||
# Qdrant vector store.
|
|
||||||
# uncomment to use qdrant as vector store.
|
|
||||||
# (if uncommented, you need to comment out the weaviate service above,
|
|
||||||
# and set VECTOR_STORE to qdrant in the api & worker service.)
|
|
||||||
# qdrant:
|
|
||||||
# image: qdrant/qdrant:1.7.3
|
|
||||||
# restart: always
|
|
||||||
# volumes:
|
|
||||||
# - ./volumes/qdrant:/qdrant/storage
|
|
||||||
# environment:
|
|
||||||
# QDRANT_API_KEY: 'difyai123456'
|
|
||||||
# ports:
|
|
||||||
# - "6333:6333"
|
|
||||||
# - "6334:6334"
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
|
||||||
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
|
|
||||||
ssrf_proxy_network:
|
|
||||||
driver: bridge
|
|
||||||
internal: true
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
version: '3.5'
|
|
||||||
|
|
||||||
services:
|
|
||||||
etcd:
|
|
||||||
container_name: milvus-etcd
|
|
||||||
image: quay.io/coreos/etcd:v3.5.5
|
|
||||||
environment:
|
|
||||||
- ETCD_AUTO_COMPACTION_MODE=revision
|
|
||||||
- ETCD_AUTO_COMPACTION_RETENTION=1000
|
|
||||||
- ETCD_QUOTA_BACKEND_BYTES=4294967296
|
|
||||||
- ETCD_SNAPSHOT_COUNT=50000
|
|
||||||
volumes:
|
|
||||||
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
|
|
||||||
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "etcdctl", "endpoint", "health"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 20s
|
|
||||||
retries: 3
|
|
||||||
|
|
||||||
minio:
|
|
||||||
container_name: milvus-minio
|
|
||||||
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
|
|
||||||
environment:
|
|
||||||
MINIO_ACCESS_KEY: minioadmin
|
|
||||||
MINIO_SECRET_KEY: minioadmin
|
|
||||||
ports:
|
|
||||||
- "9001:9001"
|
|
||||||
- "9000:9000"
|
|
||||||
volumes:
|
|
||||||
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
|
||||||
command: minio server /minio_data --console-address ":9001"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 20s
|
|
||||||
retries: 3
|
|
||||||
|
|
||||||
milvus-standalone:
|
|
||||||
container_name: milvus-standalone
|
|
||||||
image: milvusdb/milvus:v2.4.6
|
|
||||||
command: ["milvus", "run", "standalone"]
|
|
||||||
environment:
|
|
||||||
ETCD_ENDPOINTS: etcd:2379
|
|
||||||
MINIO_ADDRESS: minio:9000
|
|
||||||
common.security.authorizationEnabled: true
|
|
||||||
volumes:
|
|
||||||
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
|
||||||
interval: 30s
|
|
||||||
start_period: 90s
|
|
||||||
timeout: 20s
|
|
||||||
retries: 3
|
|
||||||
ports:
|
|
||||||
- "19530:19530"
|
|
||||||
- "9091:9091"
|
|
||||||
depends_on:
|
|
||||||
- "etcd"
|
|
||||||
- "minio"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
name: milvus
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
services:
|
|
||||||
opensearch: # This is also the hostname of the container within the Docker network (i.e. https://opensearch/)
|
|
||||||
image: opensearchproject/opensearch:latest # Specifying the latest available image - modify if you want a specific version
|
|
||||||
container_name: opensearch
|
|
||||||
environment:
|
|
||||||
- discovery.type=single-node
|
|
||||||
- bootstrap.memory_lock=true # Disable JVM heap memory swapping
|
|
||||||
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx1024m" # Set min and max JVM heap sizes to at least 50% of system RAM
|
|
||||||
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=Qazwsxedc!@#123 # Sets the demo admin user password when using demo configuration, required for OpenSearch 2.12 and later
|
|
||||||
ulimits:
|
|
||||||
memlock:
|
|
||||||
soft: -1 # Set memlock to unlimited (no soft or hard limit)
|
|
||||||
hard: -1
|
|
||||||
nofile:
|
|
||||||
soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
|
|
||||||
hard: 65536
|
|
||||||
volumes:
|
|
||||||
- ./volumes/opensearch/data:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
|
|
||||||
ports:
|
|
||||||
- 9200:9200 # REST API
|
|
||||||
- 9600:9600 # Performance Analyzer
|
|
||||||
networks:
|
|
||||||
- opensearch-net # All of the containers will join the same Docker bridge network
|
|
||||||
opensearch-dashboards:
|
|
||||||
image: opensearchproject/opensearch-dashboards:latest # Make sure the version of opensearch-dashboards matches the version of opensearch installed on other nodes
|
|
||||||
container_name: opensearch-dashboards
|
|
||||||
ports:
|
|
||||||
- 5601:5601 # Map host port 5601 to container port 5601
|
|
||||||
expose:
|
|
||||||
- "5601" # Expose port 5601 for web access to OpenSearch Dashboards
|
|
||||||
environment:
|
|
||||||
OPENSEARCH_HOSTS: '["https://opensearch:9200"]' # Define the OpenSearch nodes that OpenSearch Dashboards will query
|
|
||||||
volumes:
|
|
||||||
- ./volumes/opensearch/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
|
|
||||||
networks:
|
|
||||||
- opensearch-net
|
|
||||||
|
|
||||||
networks:
|
|
||||||
opensearch-net:
|
|
||||||
driver: bridge
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
services:
|
|
||||||
# oracle 23 ai vector store.
|
|
||||||
oracle:
|
|
||||||
image: container-registry.oracle.com/database/free:latest
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- 1521:1521
|
|
||||||
volumes:
|
|
||||||
- type: volume
|
|
||||||
source: oradata_vector
|
|
||||||
target: /opt/oracle/oradata
|
|
||||||
- ./startupscripts:/opt/oracle/scripts/startup
|
|
||||||
environment:
|
|
||||||
- ORACLE_PWD=Dify123456
|
|
||||||
- ORACLE_CHARACTERSET=AL32UTF8
|
|
||||||
volumes:
|
|
||||||
oradata_vector:
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
services:
|
|
||||||
# The pgvecto—rs database.
|
|
||||||
pgvecto-rs:
|
|
||||||
image: tensorchord/pgvecto-rs:pg16-v0.2.0
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
PGUSER: postgres
|
|
||||||
# The password for the default postgres user.
|
|
||||||
POSTGRES_PASSWORD: difyai123456
|
|
||||||
# The name of the default postgres database.
|
|
||||||
POSTGRES_DB: dify
|
|
||||||
# postgres data directory
|
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
|
||||||
volumes:
|
|
||||||
- ./volumes/pgvectors/data:/var/lib/postgresql/data
|
|
||||||
# uncomment to expose db(postgresql) port to host
|
|
||||||
ports:
|
|
||||||
- "5431:5432"
|
|
||||||
healthcheck:
|
|
||||||
test: [ "CMD", "pg_isready" ]
|
|
||||||
interval: 1s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 30
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
services:
|
|
||||||
# Qdrant vector store.
|
|
||||||
pgvector:
|
|
||||||
image: pgvector/pgvector:pg16
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
PGUSER: postgres
|
|
||||||
# The password for the default postgres user.
|
|
||||||
POSTGRES_PASSWORD: difyai123456
|
|
||||||
# The name of the default postgres database.
|
|
||||||
POSTGRES_DB: dify
|
|
||||||
# postgres data directory
|
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
|
||||||
volumes:
|
|
||||||
- ./volumes/pgvector/data:/var/lib/postgresql/data
|
|
||||||
# uncomment to expose db(postgresql) port to host
|
|
||||||
ports:
|
|
||||||
- "5433:5432"
|
|
||||||
healthcheck:
|
|
||||||
test: [ "CMD", "pg_isready" ]
|
|
||||||
interval: 1s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 30
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 62 KiB |
@ -1,12 +0,0 @@
|
|||||||
services:
|
|
||||||
# Qdrant vector store.
|
|
||||||
qdrant:
|
|
||||||
image: langgenius/qdrant:v1.7.3
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./volumes/qdrant:/qdrant/storage
|
|
||||||
environment:
|
|
||||||
QDRANT_API_KEY: 'difyai123456'
|
|
||||||
ports:
|
|
||||||
- "6333:6333"
|
|
||||||
- "6334:6334"
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name _;
|
|
||||||
|
|
||||||
location /console/api {
|
|
||||||
proxy_pass http://api:5001;
|
|
||||||
include proxy.conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api {
|
|
||||||
proxy_pass http://api:5001;
|
|
||||||
include proxy.conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /v1 {
|
|
||||||
proxy_pass http://api:5001;
|
|
||||||
include proxy.conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /files {
|
|
||||||
proxy_pass http://api:5001;
|
|
||||||
include proxy.conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://web:3000;
|
|
||||||
include proxy.conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
# If you want to support HTTPS, please uncomment the code snippet below
|
|
||||||
#listen 443 ssl;
|
|
||||||
#ssl_certificate ./../ssl/your_cert_file.cer;
|
|
||||||
#ssl_certificate_key ./../ssl/your_cert_key.key;
|
|
||||||
#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
|
|
||||||
#ssl_prefer_server_ciphers on;
|
|
||||||
#ssl_session_cache shared:SSL:10m;
|
|
||||||
#ssl_session_timeout 10m;
|
|
||||||
}
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
user nginx;
|
|
||||||
worker_processes auto;
|
|
||||||
|
|
||||||
error_log /var/log/nginx/error.log notice;
|
|
||||||
pid /var/run/nginx.pid;
|
|
||||||
|
|
||||||
|
|
||||||
events {
|
|
||||||
worker_connections 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
http {
|
|
||||||
include /etc/nginx/mime.types;
|
|
||||||
default_type application/octet-stream;
|
|
||||||
|
|
||||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
|
||||||
'$status $body_bytes_sent "$http_referer" '
|
|
||||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
|
||||||
|
|
||||||
access_log /var/log/nginx/access.log main;
|
|
||||||
|
|
||||||
sendfile on;
|
|
||||||
#tcp_nopush on;
|
|
||||||
|
|
||||||
keepalive_timeout 65;
|
|
||||||
|
|
||||||
#gzip on;
|
|
||||||
client_max_body_size 15M;
|
|
||||||
|
|
||||||
include /etc/nginx/conf.d/*.conf;
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Connection "";
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_read_timeout 3600s;
|
|
||||||
proxy_send_timeout 3600s;
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
show pdbs;
|
|
||||||
ALTER SYSTEM SET PROCESSES=500 SCOPE=SPFILE;
|
|
||||||
alter session set container= freepdb1;
|
|
||||||
create user dify identified by dify DEFAULT TABLESPACE users quota unlimited on users;
|
|
||||||
grant DB_DEVELOPER_ROLE to dify;
|
|
||||||
@ -1,222 +0,0 @@
|
|||||||
---
|
|
||||||
# Copyright OpenSearch Contributors
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
# Description:
|
|
||||||
# Default configuration for OpenSearch Dashboards
|
|
||||||
|
|
||||||
# OpenSearch Dashboards is served by a back end server. This setting specifies the port to use.
|
|
||||||
# server.port: 5601
|
|
||||||
|
|
||||||
# Specifies the address to which the OpenSearch Dashboards server will bind. IP addresses and host names are both valid values.
|
|
||||||
# The default is 'localhost', which usually means remote machines will not be able to connect.
|
|
||||||
# To allow connections from remote users, set this parameter to a non-loopback address.
|
|
||||||
# server.host: "localhost"
|
|
||||||
|
|
||||||
# Enables you to specify a path to mount OpenSearch Dashboards at if you are running behind a proxy.
|
|
||||||
# Use the `server.rewriteBasePath` setting to tell OpenSearch Dashboards if it should remove the basePath
|
|
||||||
# from requests it receives, and to prevent a deprecation warning at startup.
|
|
||||||
# This setting cannot end in a slash.
|
|
||||||
# server.basePath: ""
|
|
||||||
|
|
||||||
# Specifies whether OpenSearch Dashboards should rewrite requests that are prefixed with
|
|
||||||
# `server.basePath` or require that they are rewritten by your reverse proxy.
|
|
||||||
# server.rewriteBasePath: false
|
|
||||||
|
|
||||||
# The maximum payload size in bytes for incoming server requests.
|
|
||||||
# server.maxPayloadBytes: 1048576
|
|
||||||
|
|
||||||
# The OpenSearch Dashboards server's name. This is used for display purposes.
|
|
||||||
# server.name: "your-hostname"
|
|
||||||
|
|
||||||
# The URLs of the OpenSearch instances to use for all your queries.
|
|
||||||
# opensearch.hosts: ["http://localhost:9200"]
|
|
||||||
|
|
||||||
# OpenSearch Dashboards uses an index in OpenSearch to store saved searches, visualizations and
|
|
||||||
# dashboards. OpenSearch Dashboards creates a new index if the index doesn't already exist.
|
|
||||||
# opensearchDashboards.index: ".opensearch_dashboards"
|
|
||||||
|
|
||||||
# The default application to load.
|
|
||||||
# opensearchDashboards.defaultAppId: "home"
|
|
||||||
|
|
||||||
# Setting for an optimized healthcheck that only uses the local OpenSearch node to do Dashboards healthcheck.
|
|
||||||
# This settings should be used for large clusters or for clusters with ingest heavy nodes.
|
|
||||||
# It allows Dashboards to only healthcheck using the local OpenSearch node rather than fan out requests across all nodes.
|
|
||||||
#
|
|
||||||
# It requires the user to create an OpenSearch node attribute with the same name as the value used in the setting
|
|
||||||
# This node attribute should assign all nodes of the same cluster an integer value that increments with each new cluster that is spun up
|
|
||||||
# e.g. in opensearch.yml file you would set the value to a setting using node.attr.cluster_id:
|
|
||||||
# Should only be enabled if there is a corresponding node attribute created in your OpenSearch config that matches the value here
|
|
||||||
# opensearch.optimizedHealthcheckId: "cluster_id"
|
|
||||||
|
|
||||||
# If your OpenSearch is protected with basic authentication, these settings provide
|
|
||||||
# the username and password that the OpenSearch Dashboards server uses to perform maintenance on the OpenSearch Dashboards
|
|
||||||
# index at startup. Your OpenSearch Dashboards users still need to authenticate with OpenSearch, which
|
|
||||||
# is proxied through the OpenSearch Dashboards server.
|
|
||||||
# opensearch.username: "opensearch_dashboards_system"
|
|
||||||
# opensearch.password: "pass"
|
|
||||||
|
|
||||||
# Enables SSL and paths to the PEM-format SSL certificate and SSL key files, respectively.
|
|
||||||
# These settings enable SSL for outgoing requests from the OpenSearch Dashboards server to the browser.
|
|
||||||
# server.ssl.enabled: false
|
|
||||||
# server.ssl.certificate: /path/to/your/server.crt
|
|
||||||
# server.ssl.key: /path/to/your/server.key
|
|
||||||
|
|
||||||
# Optional settings that provide the paths to the PEM-format SSL certificate and key files.
|
|
||||||
# These files are used to verify the identity of OpenSearch Dashboards to OpenSearch and are required when
|
|
||||||
# xpack.security.http.ssl.client_authentication in OpenSearch is set to required.
|
|
||||||
# opensearch.ssl.certificate: /path/to/your/client.crt
|
|
||||||
# opensearch.ssl.key: /path/to/your/client.key
|
|
||||||
|
|
||||||
# Optional setting that enables you to specify a path to the PEM file for the certificate
|
|
||||||
# authority for your OpenSearch instance.
|
|
||||||
# opensearch.ssl.certificateAuthorities: [ "/path/to/your/CA.pem" ]
|
|
||||||
|
|
||||||
# To disregard the validity of SSL certificates, change this setting's value to 'none'.
|
|
||||||
# opensearch.ssl.verificationMode: full
|
|
||||||
|
|
||||||
# Time in milliseconds to wait for OpenSearch to respond to pings. Defaults to the value of
|
|
||||||
# the opensearch.requestTimeout setting.
|
|
||||||
# opensearch.pingTimeout: 1500
|
|
||||||
|
|
||||||
# Time in milliseconds to wait for responses from the back end or OpenSearch. This value
|
|
||||||
# must be a positive integer.
|
|
||||||
# opensearch.requestTimeout: 30000
|
|
||||||
|
|
||||||
# List of OpenSearch Dashboards client-side headers to send to OpenSearch. To send *no* client-side
|
|
||||||
# headers, set this value to [] (an empty list).
|
|
||||||
# opensearch.requestHeadersWhitelist: [ authorization ]
|
|
||||||
|
|
||||||
# Header names and values that are sent to OpenSearch. Any custom headers cannot be overwritten
|
|
||||||
# by client-side headers, regardless of the opensearch.requestHeadersWhitelist configuration.
|
|
||||||
# opensearch.customHeaders: {}
|
|
||||||
|
|
||||||
# Time in milliseconds for OpenSearch to wait for responses from shards. Set to 0 to disable.
|
|
||||||
# opensearch.shardTimeout: 30000
|
|
||||||
|
|
||||||
# Logs queries sent to OpenSearch. Requires logging.verbose set to true.
|
|
||||||
# opensearch.logQueries: false
|
|
||||||
|
|
||||||
# Specifies the path where OpenSearch Dashboards creates the process ID file.
|
|
||||||
# pid.file: /var/run/opensearchDashboards.pid
|
|
||||||
|
|
||||||
# Enables you to specify a file where OpenSearch Dashboards stores log output.
|
|
||||||
# logging.dest: stdout
|
|
||||||
|
|
||||||
# Set the value of this setting to true to suppress all logging output.
|
|
||||||
# logging.silent: false
|
|
||||||
|
|
||||||
# Set the value of this setting to true to suppress all logging output other than error messages.
|
|
||||||
# logging.quiet: false
|
|
||||||
|
|
||||||
# Set the value of this setting to true to log all events, including system usage information
|
|
||||||
# and all requests.
|
|
||||||
# logging.verbose: false
|
|
||||||
|
|
||||||
# Set the interval in milliseconds to sample system and process performance
|
|
||||||
# metrics. Minimum is 100ms. Defaults to 5000.
|
|
||||||
# ops.interval: 5000
|
|
||||||
|
|
||||||
# Specifies locale to be used for all localizable strings, dates and number formats.
|
|
||||||
# Supported languages are the following: English - en , by default , Chinese - zh-CN .
|
|
||||||
# i18n.locale: "en"
|
|
||||||
|
|
||||||
# Set the allowlist to check input graphite Url. Allowlist is the default check list.
|
|
||||||
# vis_type_timeline.graphiteAllowedUrls: ['https://www.hostedgraphite.com/UID/ACCESS_KEY/graphite']
|
|
||||||
|
|
||||||
# Set the blocklist to check input graphite Url. Blocklist is an IP list.
|
|
||||||
# Below is an example for reference
|
|
||||||
# vis_type_timeline.graphiteBlockedIPs: [
|
|
||||||
# //Loopback
|
|
||||||
# '127.0.0.0/8',
|
|
||||||
# '::1/128',
|
|
||||||
# //Link-local Address for IPv6
|
|
||||||
# 'fe80::/10',
|
|
||||||
# //Private IP address for IPv4
|
|
||||||
# '10.0.0.0/8',
|
|
||||||
# '172.16.0.0/12',
|
|
||||||
# '192.168.0.0/16',
|
|
||||||
# //Unique local address (ULA)
|
|
||||||
# 'fc00::/7',
|
|
||||||
# //Reserved IP address
|
|
||||||
# '0.0.0.0/8',
|
|
||||||
# '100.64.0.0/10',
|
|
||||||
# '192.0.0.0/24',
|
|
||||||
# '192.0.2.0/24',
|
|
||||||
# '198.18.0.0/15',
|
|
||||||
# '192.88.99.0/24',
|
|
||||||
# '198.51.100.0/24',
|
|
||||||
# '203.0.113.0/24',
|
|
||||||
# '224.0.0.0/4',
|
|
||||||
# '240.0.0.0/4',
|
|
||||||
# '255.255.255.255/32',
|
|
||||||
# '::/128',
|
|
||||||
# '2001:db8::/32',
|
|
||||||
# 'ff00::/8',
|
|
||||||
# ]
|
|
||||||
# vis_type_timeline.graphiteBlockedIPs: []
|
|
||||||
|
|
||||||
# opensearchDashboards.branding:
|
|
||||||
# logo:
|
|
||||||
# defaultUrl: ""
|
|
||||||
# darkModeUrl: ""
|
|
||||||
# mark:
|
|
||||||
# defaultUrl: ""
|
|
||||||
# darkModeUrl: ""
|
|
||||||
# loadingLogo:
|
|
||||||
# defaultUrl: ""
|
|
||||||
# darkModeUrl: ""
|
|
||||||
# faviconUrl: ""
|
|
||||||
# applicationTitle: ""
|
|
||||||
|
|
||||||
# Set the value of this setting to true to capture region blocked warnings and errors
|
|
||||||
# for your map rendering services.
|
|
||||||
# map.showRegionBlockedWarning: false%
|
|
||||||
|
|
||||||
# Set the value of this setting to false to suppress search usage telemetry
|
|
||||||
# for reducing the load of OpenSearch cluster.
|
|
||||||
# data.search.usageTelemetry.enabled: false
|
|
||||||
|
|
||||||
# 2.4 renames 'wizard.enabled: false' to 'vis_builder.enabled: false'
|
|
||||||
# Set the value of this setting to false to disable VisBuilder
|
|
||||||
# functionality in Visualization.
|
|
||||||
# vis_builder.enabled: false
|
|
||||||
|
|
||||||
# 2.4 New Experimental Feature
|
|
||||||
# Set the value of this setting to true to enable the experimental multiple data source
|
|
||||||
# support feature. Use with caution.
|
|
||||||
# data_source.enabled: false
|
|
||||||
# Set the value of these settings to customize crypto materials to encryption saved credentials
|
|
||||||
# in data sources.
|
|
||||||
# data_source.encryption.wrappingKeyName: 'changeme'
|
|
||||||
# data_source.encryption.wrappingKeyNamespace: 'changeme'
|
|
||||||
# data_source.encryption.wrappingKey: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
|
|
||||||
|
|
||||||
# 2.6 New ML Commons Dashboards Feature
|
|
||||||
# Set the value of this setting to true to enable the ml commons dashboards
|
|
||||||
# ml_commons_dashboards.enabled: false
|
|
||||||
|
|
||||||
# 2.12 New experimental Assistant Dashboards Feature
|
|
||||||
# Set the value of this setting to true to enable the assistant dashboards
|
|
||||||
# assistant.chat.enabled: false
|
|
||||||
|
|
||||||
# 2.13 New Query Assistant Feature
|
|
||||||
# Set the value of this setting to false to disable the query assistant
|
|
||||||
# observability.query_assist.enabled: false
|
|
||||||
|
|
||||||
# 2.14 Enable Ui Metric Collectors in Usage Collector
|
|
||||||
# Set the value of this setting to true to enable UI Metric collections
|
|
||||||
# usageCollection.uiMetric.enabled: false
|
|
||||||
|
|
||||||
opensearch.hosts: [https://localhost:9200]
|
|
||||||
opensearch.ssl.verificationMode: none
|
|
||||||
opensearch.username: admin
|
|
||||||
opensearch.password: 'Qazwsxedc!@#123'
|
|
||||||
opensearch.requestHeadersWhitelist: [authorization, securitytenant]
|
|
||||||
|
|
||||||
opensearch_security.multitenancy.enabled: true
|
|
||||||
opensearch_security.multitenancy.tenants.preferred: [Private, Global]
|
|
||||||
opensearch_security.readonly_mode.roles: [kibana_read_only]
|
|
||||||
# Use this setting if you are running opensearch-dashboards without https
|
|
||||||
opensearch_security.cookie.secure: false
|
|
||||||
server.host: '0.0.0.0'
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue