Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
57565db5
Unverified
Commit
57565db5
authored
Jan 30, 2024
by
takatost
Committed by
GitHub
Jan 30, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: some unused command-line tasks were removed. (#2281)
parent
d844420c
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
568 deletions
+27
-568
commands.py
api/commands.py
+27
-568
No files found.
api/commands.py
View file @
57565db5
import
base64
import
base64
import
datetime
import
json
import
json
import
math
import
random
import
secrets
import
secrets
import
string
import
threading
import
time
import
uuid
import
click
import
click
import
qdrant_client
from
constants.languages
import
user_input_form_template
from
core.embedding.cached_embedding
import
CacheEmbedding
from
core.embedding.cached_embedding
import
CacheEmbedding
from
core.index.index
import
IndexBuilder
from
core.model_manager
import
ModelManager
from
core.model_manager
import
ModelManager
from
core.model_runtime.entities.model_entities
import
ModelType
from
core.model_runtime.entities.model_entities
import
ModelType
from
extensions.ext_database
import
db
from
extensions.ext_database
import
db
from
flask
import
Flask
,
current_app
from
flask
import
current_app
from
libs.helper
import
email
as
email_validate
from
libs.helper
import
email
as
email_validate
from
libs.password
import
hash_password
,
password_pattern
,
valid_password
from
libs.password
import
hash_password
,
password_pattern
,
valid_password
from
libs.rsa
import
generate_key_pair
from
libs.rsa
import
generate_key_pair
from
models.account
import
InvitationCode
,
Tenant
,
TenantAccountJoin
from
models.account
import
Tenant
from
models.dataset
import
Dataset
,
DatasetCollectionBinding
,
DatasetQuery
,
Document
from
models.dataset
import
Dataset
from
models.model
import
Account
,
App
,
AppModelConfig
,
Message
,
MessageAnnotation
,
InstalledApp
from
models.model
import
Account
from
models.provider
import
Provider
,
ProviderModel
,
ProviderQuotaType
,
ProviderType
from
models.provider
import
Provider
,
ProviderModel
from
qdrant_client.http.models
import
TextIndexParams
,
TextIndexType
,
TokenizerType
from
tqdm
import
tqdm
from
werkzeug.exceptions
import
NotFound
from
werkzeug.exceptions
import
NotFound
...
@@ -35,15 +23,22 @@ from werkzeug.exceptions import NotFound
...
@@ -35,15 +23,22 @@ from werkzeug.exceptions import NotFound
@
click
.
option
(
'--new-password'
,
prompt
=
True
,
help
=
'the new password.'
)
@
click
.
option
(
'--new-password'
,
prompt
=
True
,
help
=
'the new password.'
)
@
click
.
option
(
'--password-confirm'
,
prompt
=
True
,
help
=
'the new password confirm.'
)
@
click
.
option
(
'--password-confirm'
,
prompt
=
True
,
help
=
'the new password confirm.'
)
def
reset_password
(
email
,
new_password
,
password_confirm
):
def
reset_password
(
email
,
new_password
,
password_confirm
):
"""
Reset password of owner account
Only available in SELF_HOSTED mode
"""
if
str
(
new_password
)
.
strip
()
!=
str
(
password_confirm
)
.
strip
():
if
str
(
new_password
)
.
strip
()
!=
str
(
password_confirm
)
.
strip
():
click
.
echo
(
click
.
style
(
'sorry. The two passwords do not match.'
,
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'sorry. The two passwords do not match.'
,
fg
=
'red'
))
return
return
account
=
db
.
session
.
query
(
Account
)
.
\
account
=
db
.
session
.
query
(
Account
)
.
\
filter
(
Account
.
email
==
email
)
.
\
filter
(
Account
.
email
==
email
)
.
\
one_or_none
()
one_or_none
()
if
not
account
:
if
not
account
:
click
.
echo
(
click
.
style
(
'sorry. the account: [{}] not exist .'
.
format
(
email
),
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'sorry. the account: [{}] not exist .'
.
format
(
email
),
fg
=
'red'
))
return
return
try
:
try
:
valid_password
(
new_password
)
valid_password
(
new_password
)
except
:
except
:
...
@@ -69,15 +64,22 @@ def reset_password(email, new_password, password_confirm):
...
@@ -69,15 +64,22 @@ def reset_password(email, new_password, password_confirm):
@
click
.
option
(
'--new-email'
,
prompt
=
True
,
help
=
'the new email.'
)
@
click
.
option
(
'--new-email'
,
prompt
=
True
,
help
=
'the new email.'
)
@
click
.
option
(
'--email-confirm'
,
prompt
=
True
,
help
=
'the new email confirm.'
)
@
click
.
option
(
'--email-confirm'
,
prompt
=
True
,
help
=
'the new email confirm.'
)
def
reset_email
(
email
,
new_email
,
email_confirm
):
def
reset_email
(
email
,
new_email
,
email_confirm
):
"""
Replace account email
:return:
"""
if
str
(
new_email
)
.
strip
()
!=
str
(
email_confirm
)
.
strip
():
if
str
(
new_email
)
.
strip
()
!=
str
(
email_confirm
)
.
strip
():
click
.
echo
(
click
.
style
(
'Sorry, new email and confirm email do not match.'
,
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'Sorry, new email and confirm email do not match.'
,
fg
=
'red'
))
return
return
account
=
db
.
session
.
query
(
Account
)
.
\
account
=
db
.
session
.
query
(
Account
)
.
\
filter
(
Account
.
email
==
email
)
.
\
filter
(
Account
.
email
==
email
)
.
\
one_or_none
()
one_or_none
()
if
not
account
:
if
not
account
:
click
.
echo
(
click
.
style
(
'sorry. the account: [{}] not exist .'
.
format
(
email
),
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'sorry. the account: [{}] not exist .'
.
format
(
email
),
fg
=
'red'
))
return
return
try
:
try
:
email_validate
(
new_email
)
email_validate
(
new_email
)
except
:
except
:
...
@@ -97,6 +99,11 @@ def reset_email(email, new_email, email_confirm):
...
@@ -97,6 +99,11 @@ def reset_email(email, new_email, email_confirm):
@
click
.
confirmation_option
(
prompt
=
click
.
style
(
'Are you sure you want to reset encrypt key pair?'
@
click
.
confirmation_option
(
prompt
=
click
.
style
(
'Are you sure you want to reset encrypt key pair?'
' this operation cannot be rolled back!'
,
fg
=
'red'
))
' this operation cannot be rolled back!'
,
fg
=
'red'
))
def
reset_encrypt_key_pair
():
def
reset_encrypt_key_pair
():
"""
Reset the encrypted key pair of workspace for encrypt LLM credentials.
After the reset, all LLM credentials will become invalid, requiring re-entry.
Only support SELF_HOSTED mode.
"""
if
current_app
.
config
[
'EDITION'
]
!=
'SELF_HOSTED'
:
if
current_app
.
config
[
'EDITION'
]
!=
'SELF_HOSTED'
:
click
.
echo
(
click
.
style
(
'Sorry, only support SELF_HOSTED mode.'
,
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'Sorry, only support SELF_HOSTED mode.'
,
fg
=
'red'
))
return
return
...
@@ -116,201 +123,11 @@ def reset_encrypt_key_pair():
...
@@ -116,201 +123,11 @@ def reset_encrypt_key_pair():
'the asymmetric key pair of workspace {} has been reset.'
.
format
(
tenant
.
id
),
fg
=
'green'
))
'the asymmetric key pair of workspace {} has been reset.'
.
format
(
tenant
.
id
),
fg
=
'green'
))
@
click
.
command
(
'generate-invitation-codes'
,
help
=
'Generate invitation codes.'
)
@
click
.
option
(
'--batch'
,
help
=
'The batch of invitation codes.'
)
@
click
.
option
(
'--count'
,
prompt
=
True
,
help
=
'Invitation codes count.'
)
def
generate_invitation_codes
(
batch
,
count
):
if
not
batch
:
now
=
datetime
.
datetime
.
now
()
batch
=
now
.
strftime
(
'
%
Y
%
m
%
d
%
H
%
M
%
S'
)
if
not
count
or
int
(
count
)
<=
0
:
click
.
echo
(
click
.
style
(
'sorry. the count must be greater than 0.'
,
fg
=
'red'
))
return
count
=
int
(
count
)
click
.
echo
(
'Start generate {} invitation codes for batch {}.'
.
format
(
count
,
batch
))
codes
=
''
for
i
in
range
(
count
):
code
=
generate_invitation_code
()
invitation_code
=
InvitationCode
(
code
=
code
,
batch
=
batch
)
db
.
session
.
add
(
invitation_code
)
click
.
echo
(
code
)
codes
+=
code
+
"
\n
"
db
.
session
.
commit
()
filename
=
'storage/invitation-codes-{}.txt'
.
format
(
batch
)
with
open
(
filename
,
'w'
)
as
f
:
f
.
write
(
codes
)
click
.
echo
(
click
.
style
(
'Congratulations! Generated {} invitation codes for batch {} and saved to the file
\'
{}
\'
'
.
format
(
count
,
batch
,
filename
),
fg
=
'green'
))
def
generate_invitation_code
():
code
=
generate_upper_string
()
while
db
.
session
.
query
(
InvitationCode
)
.
filter
(
InvitationCode
.
code
==
code
)
.
count
()
>
0
:
code
=
generate_upper_string
()
return
code
def
generate_upper_string
():
letters_digits
=
string
.
ascii_uppercase
+
string
.
digits
result
=
""
for
i
in
range
(
8
):
result
+=
random
.
choice
(
letters_digits
)
return
result
@
click
.
command
(
'recreate-all-dataset-indexes'
,
help
=
'Recreate all dataset indexes.'
)
def
recreate_all_dataset_indexes
():
click
.
echo
(
click
.
style
(
'Start recreate all dataset indexes.'
,
fg
=
'green'
))
recreate_count
=
0
page
=
1
while
True
:
try
:
datasets
=
db
.
session
.
query
(
Dataset
)
.
filter
(
Dataset
.
indexing_technique
==
'high_quality'
)
\
.
order_by
(
Dataset
.
created_at
.
desc
())
.
paginate
(
page
=
page
,
per_page
=
50
)
except
NotFound
:
break
page
+=
1
for
dataset
in
datasets
:
try
:
click
.
echo
(
'Recreating dataset index: {}'
.
format
(
dataset
.
id
))
index
=
IndexBuilder
.
get_index
(
dataset
,
'high_quality'
)
if
index
and
index
.
_is_origin
():
index
.
recreate_dataset
(
dataset
)
recreate_count
+=
1
else
:
click
.
echo
(
'passed.'
)
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Recreate dataset index error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
continue
click
.
echo
(
click
.
style
(
'Congratulations! Recreate {} dataset indexes.'
.
format
(
recreate_count
),
fg
=
'green'
))
@
click
.
command
(
'clean-unused-dataset-indexes'
,
help
=
'Clean unused dataset indexes.'
)
def
clean_unused_dataset_indexes
():
click
.
echo
(
click
.
style
(
'Start clean unused dataset indexes.'
,
fg
=
'green'
))
clean_days
=
int
(
current_app
.
config
.
get
(
'CLEAN_DAY_SETTING'
))
start_at
=
time
.
perf_counter
()
thirty_days_ago
=
datetime
.
datetime
.
now
()
-
datetime
.
timedelta
(
days
=
clean_days
)
page
=
1
while
True
:
try
:
datasets
=
db
.
session
.
query
(
Dataset
)
.
filter
(
Dataset
.
created_at
<
thirty_days_ago
)
\
.
order_by
(
Dataset
.
created_at
.
desc
())
.
paginate
(
page
=
page
,
per_page
=
50
)
except
NotFound
:
break
page
+=
1
for
dataset
in
datasets
:
dataset_query
=
db
.
session
.
query
(
DatasetQuery
)
.
filter
(
DatasetQuery
.
created_at
>
thirty_days_ago
,
DatasetQuery
.
dataset_id
==
dataset
.
id
)
.
all
()
if
not
dataset_query
or
len
(
dataset_query
)
==
0
:
documents
=
db
.
session
.
query
(
Document
)
.
filter
(
Document
.
dataset_id
==
dataset
.
id
,
Document
.
indexing_status
==
'completed'
,
Document
.
enabled
==
True
,
Document
.
archived
==
False
,
Document
.
updated_at
>
thirty_days_ago
)
.
all
()
if
not
documents
or
len
(
documents
)
==
0
:
try
:
# remove index
vector_index
=
IndexBuilder
.
get_index
(
dataset
,
'high_quality'
)
kw_index
=
IndexBuilder
.
get_index
(
dataset
,
'economy'
)
# delete from vector index
if
vector_index
:
if
dataset
.
collection_binding_id
:
vector_index
.
delete_by_group_id
(
dataset
.
id
)
else
:
if
dataset
.
collection_binding_id
:
vector_index
.
delete_by_group_id
(
dataset
.
id
)
else
:
vector_index
.
delete
()
kw_index
.
delete
()
# update document
update_params
=
{
Document
.
enabled
:
False
}
Document
.
query
.
filter_by
(
dataset_id
=
dataset
.
id
)
.
update
(
update_params
)
db
.
session
.
commit
()
click
.
echo
(
click
.
style
(
'Cleaned unused dataset {} from db success!'
.
format
(
dataset
.
id
),
fg
=
'green'
))
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'clean dataset index error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
end_at
=
time
.
perf_counter
()
click
.
echo
(
click
.
style
(
'Cleaned unused dataset from db success latency: {}'
.
format
(
end_at
-
start_at
),
fg
=
'green'
))
@
click
.
command
(
'sync-anthropic-hosted-providers'
,
help
=
'Sync anthropic hosted providers.'
)
def
sync_anthropic_hosted_providers
():
if
not
hosted_model_providers
.
anthropic
:
click
.
echo
(
click
.
style
(
'Anthropic hosted provider is not configured.'
,
fg
=
'red'
))
return
click
.
echo
(
click
.
style
(
'Start sync anthropic hosted providers.'
,
fg
=
'green'
))
count
=
0
new_quota_limit
=
hosted_model_providers
.
anthropic
.
quota_limit
page
=
1
while
True
:
try
:
providers
=
db
.
session
.
query
(
Provider
)
.
filter
(
Provider
.
provider_name
==
'anthropic'
,
Provider
.
provider_type
==
ProviderType
.
SYSTEM
.
value
,
Provider
.
quota_type
==
ProviderQuotaType
.
TRIAL
.
value
,
Provider
.
quota_limit
!=
new_quota_limit
)
.
order_by
(
Provider
.
created_at
.
desc
())
.
paginate
(
page
=
page
,
per_page
=
100
)
except
NotFound
:
break
page
+=
1
for
provider
in
providers
:
try
:
click
.
echo
(
'Syncing tenant anthropic hosted provider: {}, origin: limit {}, used {}'
.
format
(
provider
.
tenant_id
,
provider
.
quota_limit
,
provider
.
quota_used
))
original_quota_limit
=
provider
.
quota_limit
division
=
math
.
ceil
(
new_quota_limit
/
1000
)
provider
.
quota_limit
=
new_quota_limit
if
original_quota_limit
==
1000
\
else
original_quota_limit
*
division
provider
.
quota_used
=
division
*
provider
.
quota_used
db
.
session
.
commit
()
count
+=
1
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Sync tenant anthropic hosted provider error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
continue
click
.
echo
(
click
.
style
(
'Congratulations! Synced {} anthropic hosted providers.'
.
format
(
count
),
fg
=
'green'
))
@
click
.
command
(
'create-qdrant-indexes'
,
help
=
'Create qdrant indexes.'
)
@
click
.
command
(
'create-qdrant-indexes'
,
help
=
'Create qdrant indexes.'
)
def
create_qdrant_indexes
():
def
create_qdrant_indexes
():
"""
Migrate other vector database datas to Qdrant.
"""
click
.
echo
(
click
.
style
(
'Start create qdrant indexes.'
,
fg
=
'green'
))
click
.
echo
(
click
.
style
(
'Start create qdrant indexes.'
,
fg
=
'green'
))
create_count
=
0
create_count
=
0
...
@@ -374,366 +191,8 @@ def create_qdrant_indexes():
...
@@ -374,366 +191,8 @@ def create_qdrant_indexes():
click
.
echo
(
click
.
style
(
'Congratulations! Create {} dataset indexes.'
.
format
(
create_count
),
fg
=
'green'
))
click
.
echo
(
click
.
style
(
'Congratulations! Create {} dataset indexes.'
.
format
(
create_count
),
fg
=
'green'
))
@
click
.
command
(
'update-qdrant-indexes'
,
help
=
'Update qdrant indexes.'
)
def
update_qdrant_indexes
():
click
.
echo
(
click
.
style
(
'Start Update qdrant indexes.'
,
fg
=
'green'
))
create_count
=
0
page
=
1
while
True
:
try
:
datasets
=
db
.
session
.
query
(
Dataset
)
.
filter
(
Dataset
.
indexing_technique
==
'high_quality'
)
\
.
order_by
(
Dataset
.
created_at
.
desc
())
.
paginate
(
page
=
page
,
per_page
=
50
)
except
NotFound
:
break
model_manager
=
ModelManager
()
page
+=
1
for
dataset
in
datasets
:
if
dataset
.
index_struct_dict
:
if
dataset
.
index_struct_dict
[
'type'
]
!=
'qdrant'
:
try
:
click
.
echo
(
'Update dataset qdrant index: {}'
.
format
(
dataset
.
id
))
try
:
embedding_model
=
model_manager
.
get_model_instance
(
tenant_id
=
dataset
.
tenant_id
,
provider
=
dataset
.
embedding_model_provider
,
model_type
=
ModelType
.
TEXT_EMBEDDING
,
model
=
dataset
.
embedding_model
)
except
Exception
:
continue
embeddings
=
CacheEmbedding
(
embedding_model
)
from
core.index.vector_index.qdrant_vector_index
import
QdrantConfig
,
QdrantVectorIndex
index
=
QdrantVectorIndex
(
dataset
=
dataset
,
config
=
QdrantConfig
(
endpoint
=
current_app
.
config
.
get
(
'QDRANT_URL'
),
api_key
=
current_app
.
config
.
get
(
'QDRANT_API_KEY'
),
root_path
=
current_app
.
root_path
),
embeddings
=
embeddings
)
if
index
:
index
.
update_qdrant_dataset
(
dataset
)
create_count
+=
1
else
:
click
.
echo
(
'passed.'
)
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Create dataset index error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
continue
click
.
echo
(
click
.
style
(
'Congratulations! Update {} dataset indexes.'
.
format
(
create_count
),
fg
=
'green'
))
@
click
.
command
(
'normalization-collections'
,
help
=
'restore all collections in one'
)
def
normalization_collections
():
click
.
echo
(
click
.
style
(
'Start normalization collections.'
,
fg
=
'green'
))
normalization_count
=
[]
page
=
1
while
True
:
try
:
datasets
=
db
.
session
.
query
(
Dataset
)
.
filter
(
Dataset
.
indexing_technique
==
'high_quality'
)
\
.
order_by
(
Dataset
.
created_at
.
desc
())
.
paginate
(
page
=
page
,
per_page
=
100
)
except
NotFound
:
break
datasets_result
=
datasets
.
items
page
+=
1
for
i
in
range
(
0
,
len
(
datasets_result
),
5
):
threads
=
[]
sub_datasets
=
datasets_result
[
i
:
i
+
5
]
for
dataset
in
sub_datasets
:
document_format_thread
=
threading
.
Thread
(
target
=
deal_dataset_vector
,
kwargs
=
{
'flask_app'
:
current_app
.
_get_current_object
(),
'dataset'
:
dataset
,
'normalization_count'
:
normalization_count
})
threads
.
append
(
document_format_thread
)
document_format_thread
.
start
()
for
thread
in
threads
:
thread
.
join
()
click
.
echo
(
click
.
style
(
'Congratulations! restore {} dataset indexes.'
.
format
(
len
(
normalization_count
)),
fg
=
'green'
))
@
click
.
command
(
'add-qdrant-full-text-index'
,
help
=
'add qdrant full text index'
)
def
add_qdrant_full_text_index
():
click
.
echo
(
click
.
style
(
'Start add full text index.'
,
fg
=
'green'
))
binds
=
db
.
session
.
query
(
DatasetCollectionBinding
)
.
all
()
if
binds
and
current_app
.
config
[
'VECTOR_STORE'
]
==
'qdrant'
:
qdrant_url
=
current_app
.
config
[
'QDRANT_URL'
]
qdrant_api_key
=
current_app
.
config
[
'QDRANT_API_KEY'
]
client
=
qdrant_client
.
QdrantClient
(
qdrant_url
,
api_key
=
qdrant_api_key
,
# For Qdrant Cloud, None for local instance
)
for
bind
in
binds
:
try
:
text_index_params
=
TextIndexParams
(
type
=
TextIndexType
.
TEXT
,
tokenizer
=
TokenizerType
.
MULTILINGUAL
,
min_token_len
=
2
,
max_token_len
=
20
,
lowercase
=
True
)
client
.
create_payload_index
(
bind
.
collection_name
,
'page_content'
,
field_schema
=
text_index_params
)
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Create full text index error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
click
.
echo
(
click
.
style
(
'Congratulations! add collection {} full text index successful.'
.
format
(
bind
.
collection_name
),
fg
=
'green'
))
def
deal_dataset_vector
(
flask_app
:
Flask
,
dataset
:
Dataset
,
normalization_count
:
list
):
with
flask_app
.
app_context
():
try
:
click
.
echo
(
'restore dataset index: {}'
.
format
(
dataset
.
id
))
try
:
model_manager
=
ModelManager
()
embedding_model
=
model_manager
.
get_model_instance
(
tenant_id
=
dataset
.
tenant_id
,
provider
=
dataset
.
embedding_model_provider
,
model_type
=
ModelType
.
TEXT_EMBEDDING
,
model
=
dataset
.
embedding_model
)
except
Exception
:
pass
embeddings
=
CacheEmbedding
(
embedding_model
)
dataset_collection_binding
=
db
.
session
.
query
(
DatasetCollectionBinding
)
.
\
filter
(
DatasetCollectionBinding
.
provider_name
==
embedding_model
.
model_provider
.
provider_name
,
DatasetCollectionBinding
.
model_name
==
embedding_model
.
name
)
.
\
order_by
(
DatasetCollectionBinding
.
created_at
)
.
\
first
()
if
not
dataset_collection_binding
:
dataset_collection_binding
=
DatasetCollectionBinding
(
provider_name
=
embedding_model
.
model_provider
.
provider_name
,
model_name
=
embedding_model
.
name
,
collection_name
=
"Vector_index_"
+
str
(
uuid
.
uuid4
())
.
replace
(
"-"
,
"_"
)
+
'_Node'
)
db
.
session
.
add
(
dataset_collection_binding
)
db
.
session
.
commit
()
from
core.index.vector_index.qdrant_vector_index
import
QdrantConfig
,
QdrantVectorIndex
index
=
QdrantVectorIndex
(
dataset
=
dataset
,
config
=
QdrantConfig
(
endpoint
=
current_app
.
config
.
get
(
'QDRANT_URL'
),
api_key
=
current_app
.
config
.
get
(
'QDRANT_API_KEY'
),
root_path
=
current_app
.
root_path
),
embeddings
=
embeddings
)
if
index
:
# index.delete_by_group_id(dataset.id)
index
.
restore_dataset_in_one
(
dataset
,
dataset_collection_binding
)
else
:
click
.
echo
(
'passed.'
)
normalization_count
.
append
(
1
)
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Create dataset index error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
@
click
.
command
(
'update_app_model_configs'
,
help
=
'Migrate data to support paragraph variable.'
)
@
click
.
option
(
"--batch-size"
,
default
=
500
,
help
=
"Number of records to migrate in each batch."
)
def
update_app_model_configs
(
batch_size
):
pre_prompt_template
=
'{{default_input}}'
click
.
secho
(
"Start migrate old data that the text generator can support paragraph variable."
,
fg
=
'green'
)
total_records
=
db
.
session
.
query
(
AppModelConfig
)
\
.
join
(
App
,
App
.
app_model_config_id
==
AppModelConfig
.
id
)
\
.
filter
(
App
.
mode
==
'completion'
)
\
.
count
()
if
total_records
==
0
:
click
.
secho
(
"No data to migrate."
,
fg
=
'green'
)
return
num_batches
=
(
total_records
+
batch_size
-
1
)
//
batch_size
with
tqdm
(
total
=
total_records
,
desc
=
"Migrating Data"
)
as
pbar
:
for
i
in
range
(
num_batches
):
offset
=
i
*
batch_size
limit
=
min
(
batch_size
,
total_records
-
offset
)
click
.
secho
(
f
"Fetching batch {i + 1}/{num_batches} from source database..."
,
fg
=
'green'
)
data_batch
=
db
.
session
.
query
(
AppModelConfig
)
\
.
join
(
App
,
App
.
app_model_config_id
==
AppModelConfig
.
id
)
\
.
filter
(
App
.
mode
==
'completion'
)
\
.
order_by
(
App
.
created_at
)
\
.
offset
(
offset
)
.
limit
(
limit
)
.
all
()
if
not
data_batch
:
click
.
secho
(
"No more data to migrate."
,
fg
=
'green'
)
break
try
:
click
.
secho
(
f
"Migrating {len(data_batch)} records..."
,
fg
=
'green'
)
for
data
in
data_batch
:
# click.secho(f"Migrating data {data.id}, pre_prompt: {data.pre_prompt}, user_input_form: {data.user_input_form}", fg='green')
if
data
.
pre_prompt
is
None
:
data
.
pre_prompt
=
pre_prompt_template
else
:
if
pre_prompt_template
in
data
.
pre_prompt
:
continue
data
.
pre_prompt
+=
pre_prompt_template
app_data
=
db
.
session
.
query
(
App
)
\
.
filter
(
App
.
id
==
data
.
app_id
)
\
.
one
()
account_data
=
db
.
session
.
query
(
Account
)
\
.
join
(
TenantAccountJoin
,
Account
.
id
==
TenantAccountJoin
.
account_id
)
\
.
filter
(
TenantAccountJoin
.
role
==
'owner'
)
\
.
filter
(
TenantAccountJoin
.
tenant_id
==
app_data
.
tenant_id
)
\
.
one_or_none
()
if
not
account_data
:
continue
if
data
.
user_input_form
is
None
or
data
.
user_input_form
==
'null'
:
data
.
user_input_form
=
json
.
dumps
(
user_input_form_template
[
account_data
.
interface_language
])
else
:
raw_json_data
=
json
.
loads
(
data
.
user_input_form
)
raw_json_data
.
append
(
user_input_form_template
[
account_data
.
interface_language
][
0
])
data
.
user_input_form
=
json
.
dumps
(
raw_json_data
)
# click.secho(f"Updated data {data.id}, pre_prompt: {data.pre_prompt}, user_input_form: {data.user_input_form}", fg='green')
db
.
session
.
commit
()
except
Exception
as
e
:
click
.
secho
(
f
"Error while migrating data: {e}, app_id: {data.app_id}, app_model_config_id: {data.id}"
,
fg
=
'red'
)
continue
click
.
secho
(
f
"Successfully migrated batch {i + 1}/{num_batches}."
,
fg
=
'green'
)
pbar
.
update
(
len
(
data_batch
))
@
click
.
command
(
'migrate_default_input_to_dataset_query_variable'
)
@
click
.
option
(
"--batch-size"
,
default
=
500
,
help
=
"Number of records to migrate in each batch."
)
def
migrate_default_input_to_dataset_query_variable
(
batch_size
):
click
.
secho
(
"Starting..."
,
fg
=
'green'
)
total_records
=
db
.
session
.
query
(
AppModelConfig
)
\
.
join
(
App
,
App
.
app_model_config_id
==
AppModelConfig
.
id
)
\
.
filter
(
App
.
mode
==
'completion'
)
\
.
filter
(
AppModelConfig
.
dataset_query_variable
==
None
)
\
.
count
()
if
total_records
==
0
:
click
.
secho
(
"No data to migrate."
,
fg
=
'green'
)
return
num_batches
=
(
total_records
+
batch_size
-
1
)
//
batch_size
with
tqdm
(
total
=
total_records
,
desc
=
"Migrating Data"
)
as
pbar
:
for
i
in
range
(
num_batches
):
offset
=
i
*
batch_size
limit
=
min
(
batch_size
,
total_records
-
offset
)
click
.
secho
(
f
"Fetching batch {i + 1}/{num_batches} from source database..."
,
fg
=
'green'
)
data_batch
=
db
.
session
.
query
(
AppModelConfig
)
\
.
join
(
App
,
App
.
app_model_config_id
==
AppModelConfig
.
id
)
\
.
filter
(
App
.
mode
==
'completion'
)
\
.
filter
(
AppModelConfig
.
dataset_query_variable
==
None
)
\
.
order_by
(
App
.
created_at
)
\
.
offset
(
offset
)
.
limit
(
limit
)
.
all
()
if
not
data_batch
:
click
.
secho
(
"No more data to migrate."
,
fg
=
'green'
)
break
try
:
click
.
secho
(
f
"Migrating {len(data_batch)} records..."
,
fg
=
'green'
)
for
data
in
data_batch
:
config
=
AppModelConfig
.
to_dict
(
data
)
tools
=
config
[
"agent_mode"
][
"tools"
]
dataset_exists
=
"dataset"
in
str
(
tools
)
if
not
dataset_exists
:
continue
user_input_form
=
config
.
get
(
"user_input_form"
,
[])
for
form
in
user_input_form
:
paragraph
=
form
.
get
(
'paragraph'
)
if
paragraph
\
and
paragraph
.
get
(
'variable'
)
==
'query'
:
data
.
dataset_query_variable
=
'query'
break
if
paragraph
\
and
paragraph
.
get
(
'variable'
)
==
'default_input'
:
data
.
dataset_query_variable
=
'default_input'
break
db
.
session
.
commit
()
except
Exception
as
e
:
click
.
secho
(
f
"Error while migrating data: {e}, app_id: {data.app_id}, app_model_config_id: {data.id}"
,
fg
=
'red'
)
continue
click
.
secho
(
f
"Successfully migrated batch {i + 1}/{num_batches}."
,
fg
=
'green'
)
pbar
.
update
(
len
(
data_batch
))
@
click
.
command
(
'add-annotation-question-field-value'
,
help
=
'add annotation question value'
)
def
add_annotation_question_field_value
():
click
.
echo
(
click
.
style
(
'Start add annotation question value.'
,
fg
=
'green'
))
message_annotations
=
db
.
session
.
query
(
MessageAnnotation
)
.
all
()
message_annotation_deal_count
=
0
if
message_annotations
:
for
message_annotation
in
message_annotations
:
try
:
if
message_annotation
.
message_id
and
not
message_annotation
.
question
:
message
=
db
.
session
.
query
(
Message
)
.
filter
(
Message
.
id
==
message_annotation
.
message_id
)
.
first
()
message_annotation
.
question
=
message
.
query
db
.
session
.
add
(
message_annotation
)
db
.
session
.
commit
()
message_annotation_deal_count
+=
1
except
Exception
as
e
:
click
.
echo
(
click
.
style
(
'Add annotation question value error: {} {}'
.
format
(
e
.
__class__
.
__name__
,
str
(
e
)),
fg
=
'red'
))
click
.
echo
(
click
.
style
(
f
'Congratulations! add annotation question value successful. Deal count {message_annotation_deal_count}'
,
fg
=
'green'
))
def
register_commands
(
app
):
def
register_commands
(
app
):
app
.
cli
.
add_command
(
reset_password
)
app
.
cli
.
add_command
(
reset_password
)
app
.
cli
.
add_command
(
reset_email
)
app
.
cli
.
add_command
(
reset_email
)
app
.
cli
.
add_command
(
generate_invitation_codes
)
app
.
cli
.
add_command
(
reset_encrypt_key_pair
)
app
.
cli
.
add_command
(
reset_encrypt_key_pair
)
app
.
cli
.
add_command
(
recreate_all_dataset_indexes
)
app
.
cli
.
add_command
(
sync_anthropic_hosted_providers
)
app
.
cli
.
add_command
(
clean_unused_dataset_indexes
)
app
.
cli
.
add_command
(
create_qdrant_indexes
)
app
.
cli
.
add_command
(
create_qdrant_indexes
)
app
.
cli
.
add_command
(
update_qdrant_indexes
)
app
.
cli
.
add_command
(
update_app_model_configs
)
app
.
cli
.
add_command
(
normalization_collections
)
app
.
cli
.
add_command
(
migrate_default_input_to_dataset_query_variable
)
app
.
cli
.
add_command
(
add_qdrant_full_text_index
)
app
.
cli
.
add_command
(
add_annotation_question_field_value
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment