Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/note book #2134

Merged
merged 20 commits into from
Nov 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
fcd9cf0
feat(server): auto start libro server
yhjun1026 Nov 5, 2024
f3895dd
feat(server):libro server use config and add notebook flow path
yhjun1026 Nov 6, 2024
faee2e6
feat(server):flow path get use uid
yhjun1026 Nov 7, 2024
ef55258
feat: add libro web (#2120)
sunshinesmilelk Nov 8, 2024
1c64f09
feat(server):flow path get use uid
yhjun1026 Nov 11, 2024
64c3d75
feat(server):增加libro服务模块后续为libro对接开放接口 以及做libro服务启动入口
yhjun1026 Nov 13, 2024
3c73ef7
feat(server):增加libro服务模块后续为libro对接开放接口 以及做libro服务启动入口
yhjun1026 Nov 13, 2024
edf88f1
feat(web): set language and themes of libro & update csp for libro if…
sunshinesmilelk Nov 18, 2024
0e83c68
feat(server):增加libro服务模块后续为libro对接开放接口 以及做libro服务启动入口
yhjun1026 Nov 18, 2024
a3eec66
feat(server):libro module update
yhjun1026 Nov 18, 2024
79e615b
feat(server):libro notebook show python flow
yhjun1026 Nov 18, 2024
e2bd343
Merge branch 'refs/heads/main' into feat/note_book
yhjun1026 Nov 18, 2024
b6543c2
feat(server):libro notebook show python flow
yhjun1026 Nov 18, 2024
1981238
feat(server):libro notebook show python flow
yhjun1026 Nov 18, 2024
24c5aa4
feat(server):libro notebook show python flow
yhjun1026 Nov 18, 2024
ec33e1d
feat(server):libro notebook show python flow
yhjun1026 Nov 19, 2024
a54814d
feat(server):libro server user none token
yhjun1026 Nov 21, 2024
1667503
feat(web): use the same targetOrigin (#2146)
sunshinesmilelk Nov 21, 2024
7b918bb
feat(server):note book web static files
yhjun1026 Nov 21, 2024
a0f8883
fix: default close the notebook
csunny Nov 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -329,3 +329,6 @@ DBGPT_LOG_LEVEL=INFO
#** FINANCIAL CHAT Config **#
#*******************************************************************#
# FIN_REPORT_MODEL=/app/models/bge-large-zh

## Turn off notebook display Python flow , which is enabled by default
NOTE_BOOK_ENABLE=False
4 changes: 4 additions & 0 deletions dbgpt/_private/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,10 @@ def __init__(self) -> None:
self.SCHEDULER_ENABLED = (
os.getenv("SCHEDULER_ENABLED", "True").lower() == "true"
)
self.NOTE_BOOK_ENABLE: bool = (
os.getenv("NOTE_BOOK_ENABLE", "True").lower() == "true"
)
self.NOTE_BOOK_ROOT: str = os.getenv("NOTE_BOOK_ROOT", os.path.expanduser("~"))

@property
def local_db_manager(self) -> "ConnectorManager":
Expand Down
7 changes: 7 additions & 0 deletions dbgpt/agent/core/plan/awel/agent_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ async def map(self, input_value: AgentGenerateContext) -> AgentGenerateContext:
# Default single step transfer of information
rely_messages=now_rely_messages,
silent=input_value.silent,
memory=input_value.memory.structure_clone() if input_value.memory else None,
agent_context=input_value.agent_context,
llm_client=input_value.llm_client,
begin_agent=None,
last_speaker=self.agent,
already_started=True,
)


Expand Down Expand Up @@ -291,6 +297,7 @@ async def get_agent(
prompt_template = None
if self.awel_agent.agent_prompt:
from dbgpt.serve.prompt.api.endpoints import get_service

prompt_service = get_service()
prompt_template = prompt_service.get_template(
self.awel_agent.agent_prompt.code
Expand Down
2 changes: 2 additions & 0 deletions dbgpt/agent/core/plan/awel/agent_operator_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
ResourceCategory,
register_resource,
)

from ....resource.base import AgentResource, ResourceType
from ....resource.manage import get_resource_manager
from ....util.llm.llm import LLMConfig, LLMStrategyType
Expand All @@ -20,6 +21,7 @@

def _agent_resource_prompt_values() -> List[OptionValue]:
from dbgpt.serve.prompt.api.endpoints import get_service

prompt_service = get_service()
prompts = prompt_service.get_target_prompt()
return [
Expand Down
38 changes: 18 additions & 20 deletions dbgpt/agent/core/plan/awel/team_awel_layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,16 +165,15 @@ async def act(
)
last_message = final_generate_context.rely_messages[-1]
last_message.rounds = last_message.rounds + 1
if not final_generate_context.last_speaker:
raise ValueError("Dont have last speaker agent!")
await final_generate_context.last_speaker.send(
last_message,
sender,
start_message_context.reviewer,
False,
is_retry_chat=is_retry_chat,
last_speaker_name=last_speaker_name,
)
if final_generate_context.last_speaker:
await final_generate_context.last_speaker.send(
last_message,
sender,
start_message_context.reviewer,
False,
is_retry_chat=is_retry_chat,
last_speaker_name=last_speaker_name,
)

view_message = None
if last_message.action_report:
Expand Down Expand Up @@ -269,16 +268,15 @@ async def act(

last_message = final_generate_context.rely_messages[-1]
last_message.rounds = last_message.rounds + 1
if not final_generate_context.last_speaker:
raise ValueError("Not have last speaker!")
await final_generate_context.last_speaker.send(
last_message,
sender,
start_message_context.reviewer,
False,
is_retry_chat=is_retry_chat,
last_speaker_name=last_speaker_name,
)
if final_generate_context.last_speaker:
await final_generate_context.last_speaker.send(
last_message,
sender,
start_message_context.reviewer,
False,
is_retry_chat=is_retry_chat,
last_speaker_name=last_speaker_name,
)

view_message = None
if last_message.action_report:
Expand Down
4 changes: 1 addition & 3 deletions dbgpt/app/dbgpt_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
STATIC_MESSAGE_IMG_PATH,
)
from dbgpt.serve.core import add_exception_handler
from dbgpt.util.fastapi import create_app, replace_router
from dbgpt.util.fastapi import create_app, register_event_handler, replace_router
from dbgpt.util.i18n_utils import _, set_default_language
from dbgpt.util.parameter_utils import _get_dict_from_obj
from dbgpt.util.system_utils import get_system_info
Expand All @@ -43,7 +43,6 @@
ROOT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(ROOT_PATH)


CFG = Config()
set_default_language(CFG.LANGUAGE)

Expand All @@ -61,7 +60,6 @@
# Use custom router to support priority
replace_router(app)


system_app = SystemApp(app)


Expand Down
Binary file added dbgpt/app/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 8 additions & 2 deletions dbgpt/app/initialization/serve_initialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,16 @@ def register_serve_apps(system_app: SystemApp, cfg: Config, webserver_port: int)

# ################################ File Serve Register End ########################################

# ################################ Evaluate Serve Register Begin #######################################
# ################################ Evaluate Serve Register Begin ##################################
from dbgpt.serve.evaluate.serve import Serve as EvaluateServe

# Register serve Evaluate
system_app.register(EvaluateServe)
# ################################ Evaluate Serve Register End ####################################

# ################################ Evaluate Serve Register End ########################################
# ################################ Libro Serve Register Begin #####################################
from dbgpt.serve.libro.serve import Serve as LibroServe

# Register serve libro
system_app.register(LibroServe)
# ################################ Libro Serve Register End #######################################
132 changes: 67 additions & 65 deletions dbgpt/app/knowledge/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
import os
import shutil
import tempfile
from typing import List
from pathlib import Path
from typing import List

from fastapi import APIRouter, Depends, File, Form, UploadFile, HTTPException
from fastapi import APIRouter, Depends, File, Form, HTTPException, UploadFile

from dbgpt._private.config import Config
from dbgpt.app.knowledge.request.request import (
Expand Down Expand Up @@ -333,70 +333,72 @@ def document_delete(space_name: str, query_request: DocumentQueryRequest):

@router.post("/knowledge/{space_name}/document/upload")
async def document_upload(
space_name: str,
doc_name: str = Form(...),
doc_type: str = Form(...),
doc_file: UploadFile = File(...),
space_name: str,
doc_name: str = Form(...),
doc_type: str = Form(...),
doc_file: UploadFile = File(...),
):
print(f"/document/upload params: {space_name}")
try:
if doc_file:
# Sanitize inputs to prevent path traversal
safe_space_name = os.path.basename(space_name)
safe_filename = os.path.basename(doc_file.filename)

# Create absolute paths and verify they are within allowed directory
upload_dir = os.path.abspath(os.path.join(KNOWLEDGE_UPLOAD_ROOT_PATH, safe_space_name))
target_path = os.path.abspath(os.path.join(upload_dir, safe_filename))

if not os.path.abspath(KNOWLEDGE_UPLOAD_ROOT_PATH) in target_path:
raise HTTPException(status_code=400, detail="Invalid path detected")

if not os.path.exists(upload_dir):
os.makedirs(upload_dir)

# Create temp file
tmp_fd, tmp_path = tempfile.mkstemp(dir=upload_dir)

try:
with os.fdopen(tmp_fd, "wb") as tmp:
tmp.write(await doc_file.read())

shutil.move(tmp_path, target_path)

request = KnowledgeDocumentRequest()
request.doc_name = doc_name
request.doc_type = doc_type
request.content = target_path

space_res = knowledge_space_service.get_knowledge_space(
KnowledgeSpaceRequest(name=safe_space_name)
)
if len(space_res) == 0:
# create default space
if "default" != safe_space_name:
raise Exception(f"you have not create your knowledge space.")
knowledge_space_service.create_knowledge_space(
KnowledgeSpaceRequest(
name=safe_space_name,
desc="first db-gpt rag application",
owner="dbgpt",
)
)
return Result.succ(
knowledge_space_service.create_knowledge_document(
space=safe_space_name, request=request
)
)
except Exception as e:
# Clean up temp file if anything goes wrong
if os.path.exists(tmp_path):
os.unlink(tmp_path)
raise e

return Result.failed(code="E000X", msg=f"doc_file is None")
except Exception as e:
return Result.failed(code="E000X", msg=f"document add error {e}")
print(f"/document/upload params: {space_name}")
try:
if doc_file:
# Sanitize inputs to prevent path traversal
safe_space_name = os.path.basename(space_name)
safe_filename = os.path.basename(doc_file.filename)

# Create absolute paths and verify they are within allowed directory
upload_dir = os.path.abspath(
os.path.join(KNOWLEDGE_UPLOAD_ROOT_PATH, safe_space_name)
)
target_path = os.path.abspath(os.path.join(upload_dir, safe_filename))

if not os.path.abspath(KNOWLEDGE_UPLOAD_ROOT_PATH) in target_path:
raise HTTPException(status_code=400, detail="Invalid path detected")

if not os.path.exists(upload_dir):
os.makedirs(upload_dir)

# Create temp file
tmp_fd, tmp_path = tempfile.mkstemp(dir=upload_dir)

try:
with os.fdopen(tmp_fd, "wb") as tmp:
tmp.write(await doc_file.read())

shutil.move(tmp_path, target_path)

request = KnowledgeDocumentRequest()
request.doc_name = doc_name
request.doc_type = doc_type
request.content = target_path

space_res = knowledge_space_service.get_knowledge_space(
KnowledgeSpaceRequest(name=safe_space_name)
)
if len(space_res) == 0:
# create default space
if "default" != safe_space_name:
raise Exception(f"you have not create your knowledge space.")
knowledge_space_service.create_knowledge_space(
KnowledgeSpaceRequest(
name=safe_space_name,
desc="first db-gpt rag application",
owner="dbgpt",
)
)
return Result.succ(
knowledge_space_service.create_knowledge_document(
space=safe_space_name, request=request
)
)
except Exception as e:
# Clean up temp file if anything goes wrong
if os.path.exists(tmp_path):
os.unlink(tmp_path)
raise e

return Result.failed(code="E000X", msg=f"doc_file is None")
except Exception as e:
return Result.failed(code="E000X", msg=f"document add error {e}")


@router.post("/knowledge/{space_name}/document/sync")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

class ValueItem(BaseModel):
name: str
type: str = None
type: Optional[str] = None
value: float

def dict(self, *args, **kwargs):
Expand Down
2 changes: 1 addition & 1 deletion dbgpt/app/static/web/404.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="icon" href="/favicon.ico"/><meta name="description" content="Revolutionizing Database Interactions with Private LLM Technology"/><meta property="og:description" content="eosphoros-ai"/><meta property="og:title" content="DB-GPT"/><link rel="preload" href="/_next/static/css/56abd552837c60f9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56abd552837c60f9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/_next/static/chunks/webpack-3257fddca97289f9.js" defer=""></script><script src="/_next/static/chunks/framework-fb9c0d50ace2b075.js" defer=""></script><script src="/_next/static/chunks/main-fd0d7e13da40ad83.js" defer=""></script><script src="/_next/static/chunks/pages/_app-e3c58054813ebb2b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-4fa9991a75118e6f.js" defer=""></script><script src="/_next/static/ujdCH5HCMF0OXSAWRqVTP/_buildManifest.js" defer=""></script><script src="/_next/static/ujdCH5HCMF0OXSAWRqVTP/_ssgManifest.js" defer=""></script><link rel="stylesheet" href="/_next/static/css/antd-output/antd.min.7d5365b5.css"/></head><body><div id="__next"><div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"ujdCH5HCMF0OXSAWRqVTP","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="icon" href="/favicon.ico"/><meta name="description" content="Revolutionizing Database Interactions with Private LLM Technology"/><meta property="og:description" content="eosphoros-ai"/><meta property="og:title" content="DB-GPT"/><link rel="preload" href="/_next/static/css/56abd552837c60f9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56abd552837c60f9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/_next/static/chunks/webpack-f9489bc48c5d1540.js" defer=""></script><script src="/_next/static/chunks/framework-8b06d32cbb857e0e.js" defer=""></script><script src="/_next/static/chunks/main-6c4c7f5b8c9b1320.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7c76237d5662964a.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8095ba9e1bf12f30.js" defer=""></script><script src="/_next/static/oyFmgKTpzOHc-wyB30CA1/_buildManifest.js" defer=""></script><script src="/_next/static/oyFmgKTpzOHc-wyB30CA1/_ssgManifest.js" defer=""></script><link rel="stylesheet" href="/_next/static/css/antd-output/antd.min.7d5365b5.css"/></head><body><div id="__next"><div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"oyFmgKTpzOHc-wyB30CA1","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
2 changes: 1 addition & 1 deletion dbgpt/app/static/web/404/index.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="icon" href="/favicon.ico"/><meta name="description" content="Revolutionizing Database Interactions with Private LLM Technology"/><meta property="og:description" content="eosphoros-ai"/><meta property="og:title" content="DB-GPT"/><link rel="preload" href="/_next/static/css/56abd552837c60f9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56abd552837c60f9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/_next/static/chunks/webpack-3257fddca97289f9.js" defer=""></script><script src="/_next/static/chunks/framework-fb9c0d50ace2b075.js" defer=""></script><script src="/_next/static/chunks/main-fd0d7e13da40ad83.js" defer=""></script><script src="/_next/static/chunks/pages/_app-e3c58054813ebb2b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-4fa9991a75118e6f.js" defer=""></script><script src="/_next/static/ujdCH5HCMF0OXSAWRqVTP/_buildManifest.js" defer=""></script><script src="/_next/static/ujdCH5HCMF0OXSAWRqVTP/_ssgManifest.js" defer=""></script><link rel="stylesheet" href="/_next/static/css/antd-output/antd.min.7d5365b5.css"/></head><body><div id="__next"><div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"ujdCH5HCMF0OXSAWRqVTP","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="icon" href="/favicon.ico"/><meta name="description" content="Revolutionizing Database Interactions with Private LLM Technology"/><meta property="og:description" content="eosphoros-ai"/><meta property="og:title" content="DB-GPT"/><link rel="preload" href="/_next/static/css/56abd552837c60f9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/56abd552837c60f9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/_next/static/chunks/webpack-f9489bc48c5d1540.js" defer=""></script><script src="/_next/static/chunks/framework-8b06d32cbb857e0e.js" defer=""></script><script src="/_next/static/chunks/main-6c4c7f5b8c9b1320.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7c76237d5662964a.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8095ba9e1bf12f30.js" defer=""></script><script src="/_next/static/oyFmgKTpzOHc-wyB30CA1/_buildManifest.js" defer=""></script><script src="/_next/static/oyFmgKTpzOHc-wyB30CA1/_ssgManifest.js" defer=""></script><link rel="stylesheet" href="/_next/static/css/antd-output/antd.min.7d5365b5.css"/></head><body><div id="__next"><div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"oyFmgKTpzOHc-wyB30CA1","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>

Large diffs are not rendered by default.

Loading
Loading