1- # Generated by Django 4.2.15 on 2025-03-13 02:56
1+ # Generated by Django 4.2.15 on 2025-03-13 07:21
22
33from django .db import migrations , models
44
5- function_template = """
6- INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, template_id) VALUES ('2025-02-26 03:36:48.187286 +00:00', '2025-03-11 07:23:46.123972 +00:00', 'e89ad2ae-f3f2-11ef-ad09-0242ac110002', 'Google Search', 'Google Web Search', e'def google_search(query, apikey, cx):
5+ function_template = '''
6+ INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, init_params, template_id) VALUES ('2025-03-10 06:20:35.945414 +00:00', '2025-03-10 09:19:23.608026 +00:00', 'c75cb48e-fd77-11ef-84d2-5618c4394482', '博查AI', '从博查搜索任何信息和网页URL', e'def bocha_search(query, apikey):
7+ import requests
8+ import json
9+ url = "https://api.bochaai.com/v1/web-search"
10+ payload = json.dumps({
11+ "query": query,
12+ "Boolean": "true",
13+ "count": 8
14+ })
15+
16+ headers = {
17+ "Authorization": "Bearer " + apikey, #鉴权参数,示例:Bearer xxxxxx,API KEY请先前往博查AI开放平台(https://open.bochaai.com)> API KEY 管理中获取。
18+ "Content-Type": "application/json"
19+ }
20+
21+ response = requests.request("POST", url, headers=headers, data=payload)
22+ if response.status_code == 200:
23+ return response.json()
24+ else:
25+ raise Exception(f"API请求失败: {response.status_code}, 错误信息: {response.text}")
26+ return (response.text)', '{"{\\ "name\\ ": \\ "query\\ ", \\ "type\\ ": \\ "string\\ ", \\ "source\\ ": \\ "reference\\ ", \\ "is_required\\ ": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', TRUE, 'PUBLIC', 'INTERNAL', '/src/assets/fx/bochaai/icon.png', '[{"attrs": {"type": "password", "maxlength": 200, "minlength": 1, "show-password": true, "show-word-limit": true}, "field": "apikey", "label": "apikey", "required": true, "input_type": "PasswordInput", "props_info": {"rules": [{"message": "apikey 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "apikey长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}]', '', NULL);
27+ INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, init_params, template_id) VALUES ('2025-02-26 03:36:48.187286 +00:00', '2025-03-11 07:23:46.123972 +00:00', 'e89ad2ae-f3f2-11ef-ad09-0242ac110002', 'Google Search', 'Google Web Search', e'def google_search(query, apikey, cx):
728 import requests
829 import json
930 url = "https://customsearch.googleapis.com/customsearch/v1"
1637
1738 response = requests.get(url, params=params)
1839 if response.status_code == 200:
19- contexts = response.json()[\' items\' ]
20- max_context = min(len(contexts), 10)
21- format_contexts = []
22- for i in range(max_context):
23- formatted_context = f"[[引用:{i + 1}]]\\ n网页标题:{contexts[i][\' title\' ]}\\ n网页链接:{contexts[i][\' link\' ]}\\ n网页内容:{contexts[i][\' snippet\' ]}\\ n网站名称:{contexts[i][\' displayLink\' ]}"
24- format_contexts.append(formatted_context)
25-
26- context = "\\ n\\ n".join(format_contexts)
27- return context
40+ return response.json()
2841 else:
29- print(f"Error: {response.status_code}")
30- return None', '{"{\" name\" : \" query\" , \" type\" : \" string\" , \" source\" : \" reference\" , \" is_required\" : true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/google_search/icon.png', 'd3OH0CJYyODrbL1+EgFQ0umVWmb3ZpLsZkv5eqskvXeikcuHXoF0Ta/sVBvdLBDcm4LCLKEgZkUOq9JQb+9qiVA6IHq0ZSFj+JpMIDgl3YVnFbhyTpGp3nAxOm2Y7ufmeMtVIOq20Is1ynOrdIB7UHWrvEOmSq+O8kY612X6VtMHrshkMFL9huiRdQThhnsEZdLdhHgkp9BjpCBJl8SbzTjJmVX4QeswobF5Kr3IRPZBPzrFh0S4jM6Ie0dW6OA5UwgCOBeIVyBxNytarj629kz9EWluns/UGVY8IoXQsphB9m63tXADZ9+djKfRV6TUBosi963DZLi893yY+M7o5UN+eK2u+6FQfy8pTwwiSdNIXtC16pcpvJvG+2jmNeTF1bzOS1fok+L0k/kHhOyzARk8BG1DDyvCsn73QIlnTbKrqCYN9q5zsRQvZPhBMg/g1/oOL147pRArs41htrzOObFP6MbQVM5DXX8tbvro24F7EjGMktoYpPLhqtiMNv9qn7tQbpRfDMYvMHUMiXfLXSroQH2u9a2pb7rBk0QtNJF18069t3p6nXRw3UsUsOXHvYZ1AyBQb6Jy+JbT2OIyUVKfqCvv86ZgnX6JNGqCQXHiFMuxmFI4i62b8f4uPpPBGw9PS5LFZYTm4VWHALoOKQyyOdrbIxk2+lCii5DeT2NkYNi+EaHCQ8/TKHhyG1DGymZPZ7VEK+WxmCwRlr6DEtQfEntlFyWgAimhHtxaTTM7uVViAU3ddCDUtmrOQBteK5c0BzvsMcLMSvsev5UKKo7Q1jipPORgKCun+d0El/qg4Fe38yqWHXBS4jbTuwtiNDsdabrZ0rJnDm3BRJQydouak1rg9GDXcCsHligdR5hJJqP1VqLLUDuoRC8V9urFI0udNQLWKFYPog3J4S/XYbdeQZvio8ZfDQRSWtADWj9B8voLRK8aJMT6HkKXsveRw8GlDNKu/JK44KS7uLCaE9QsIp4zYxRfpkYTx29VXI5vm+a6zvPGz9sJO9nowIOjTV5RMZ3MoS49JM7oGAjJ/5gTk5ZYWC56kmr7712NKZYxiDhDWhs+IYewujcEnj17L9hULDWQCqL+xGR25ayMGukWp4TREVTZxn3p0H7VZrlSrSiLWCISl6+dLED3reclcVsUsqR1YxHCNnPv+0VKmxS8MiMANYf3mf2QoI0F3tHst+sMSq08eJNLbYqCTCP6hOhG5rVbh3pDvSbpfMaPsRumzi3R0FY6mudBoG9g31Jl4N4HF82luL7Oj/kIkzA18aq1Zcl2UTy7Nnqjn8oTRqc8I3RjFxV1BY2zaiK3pvMPKDw7QBSWTa8T6xdq1/17cETKQRwVjjb8gWy1R8Q9khkEMN49TaZDoMLIsCN6EzvsmHXmUdxFxh5kBmG3GLmbttpYpKOPwGCFbykUf8x8jxubOLrgLsyUhNk/vMI/Y4ZHWVIAjZNlRowJYklyHMSmYFwSywczvg1mkE4qmAcKPJGOuBWzlh788VlQrc5E8yil7VexqW8nN/ho/aFd+G+RSPECaE6AvklZa6CPZTZzyhUPqHLVSG0Yq7lWxqc1XUbW3BJWPRF64ghf8VCAguSZpwSoTMBXBKGWa9er0cLSCZheTQSs5tIOkt93zhnATjeebvJPR/IhOZpM6m83o9JHtNLR6jsXS8R87+VivMJA+fp1NyWemwqBm9BNKt3A2E8=', null);
31- INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, template_id) VALUES ('2025-03-10 06:20:35.945414 +00:00', '2025-03-10 09:19:23.608026 +00:00', 'c75cb48e-fd77-11ef-84d2-5618c4394482', '博查AI', '从博查搜索任何信息和网页URL', e'def bocha_search(query, apikey):
32- import requests
42+ raise Exception(f"API请求失败: {response.status_code}, 错误信息: {response.text}")
43+ return (response.text)', '{"{\\ "name\\ ": \\ "query\\ ", \\ "type\\ ": \\ "string\\ ", \\ "source\\ ": \\ "reference\\ ", \\ "is_required\\ ": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', TRUE, 'PUBLIC', 'INTERNAL', '/src/assets/fx/google_search/icon.png', '[{"attrs": {"type": "password", "maxlength": 200, "minlength": 1, "show-password": true, "show-word-limit": true}, "field": "apikey", "label": "apikey", "required": true, "input_type": "PasswordInput", "props_info": {"rules": [{"message": "apikey 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "apikey长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}, {"attrs": {"maxlength": 200, "minlength": 1, "show-word-limit": true}, "field": "cx", "label": "cx", "required": true, "input_type": "TextInput", "props_info": {"rules": [{"message": "cx 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "cx长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}]', '', NULL);
44+ INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, init_params, template_id) VALUES ('2025-02-25 07:44:40.141515 +00:00', '2025-03-11 06:33:53.248495 +00:00', '5e912f00-f34c-11ef-8a9c-5618c4394482', 'LangSearch API', e'A Web Search API supporting natural language search
45+ ', e'
46+ def langsearch(query, apikey):
3347 import json
34- url = "https://api.bochaai.com/v1/web-search"
35- payload = json.dumps({
36- "query": query,
37- "Boolean": \' true\' ,
38- "count": 8
39- })
40-
41- headers = {
42- \' Authorization\' : \' Bearer \' + apikey, #鉴权参数,示例:Bearer xxxxxx,API KEY请先前往博查AI开放平台(https://open.bochaai.com)> API KEY 管理中获取。
43- \' Content-Type\' : \' application/json\'
44- }
45-
46- response = requests.request("POST", url, headers=headers, data=payload)
47- return response.json()', '{"{\" name\" : \" query\" , \" type\" : \" string\" , \" source\" : \" reference\" , \" is_required\" : true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/bochaai/icon.png', 'X1ukYeWnI4usm6Emy2bVb0NigczyEZVe4MVst83D1Hgiqti9CNOiLNcANkuX05K+huX1D5p2g7LVFghgpM8ddoSMax5faAsG7tw1UZtPoexYp0ssjXDHBfFCbZcIs/X4Gjio5Lk33X7FQojOM1BIR1P/itxv0U5G1Q45FKg51kdiZoafKYuf24aqqMNDscCnLLQxwVt259BGU5JY4zIuv9hxAxX/7QCXJmgu5CrheuLiTqjRS4TzqBUrLtB/AT4QjrlILeZBwnQ5k2BKFp0mbVeAA+rAaJzBg0GmmnljsJolrKjdPuCWEwCnNw2uptlE3DePXvELsAPEuADBoeE/L5q4RFFzNvkgREsfWn2PaeSkutLUAItE+S3+Ol0QGmnIE7OabifpAgNDH6aalRjYcPNuWZ0V17XzcjFXRwpQFHd6TjkfsgpI5J2m+rZyGayZ9+4XFNbzv9u84TurOvLTGa5IHTbP9Yj4ND4xXyGT+zN0TeOZ3c7XeyoqJWVMNcsp6dc7hiQT5jc9rpRmNUtYo47KPcZfRHq3ToQjdJhx7ZpLA1Uun1RcW+lKhrDpy/ce2f8TjC2+gE7HpDIYeYMB+W0eDX/LHICAWdw/v8gaTn0wlmw9TVW8loqgVBQVlWdEUV2ErkJNfxliwcCD/AxWXlrvaF1FpLOGy6wgUPExoetnDS5BftFumvOEj6R3jfy7jThdEI3+YtNGTg6QA9cBlJ7Ey3nrixZGt/+j9TwAnPhNXcjs/SVGUzxBx+VmUN+jCXMJr93D/yOwnlUkkHljRisyoWIXXOlvOx9y41p2yJRXA1SWQ5n7O/FUA38Z/6w89OMNnPJHfMZgztV8SxgBsayR2echA6XXdmvBLbZlgyr1AugwcR+ZN2t3ayRG8muRYL9S6gNSywxOyaLKFuesOCDO+vU1NdegTFMKYoJuXts0W7bIzYjDB1vQyX9ggAzodTWLUz9sjzAh4zDMbnxPJdNXGVx4O61H0qoU40bPGLZGnPl1+b+mahgCVM7Q28UA', null);
48- INSERT INTO function_lib (create_time, update_time, id, name, "desc", code, input_field_list, user_id, is_active, permission_type, function_type, icon, init_field_list, template_id) VALUES ('2025-02-25 07:44:40.141515 +00:00', '2025-03-11 06:33:53.248495 +00:00', '5e912f00-f34c-11ef-8a9c-5618c4394482', 'LangSearch API', e'A Web Search API supporting natural language search
49- ', e'def search(query, apikey):
5048 import requests
51- import json
49+
5250 url = "https://api.langsearch.com/v1/web-search"
5351 payload = json.dumps({
5452 "query": query,
5553 "summary": True,
5654 "freshness": "noLimit",
57- "summary": True,
5855 "livecrawl": True,
5956 "count": 20
6057 })
6158 headers = {
62- \' Authorization\' : apikey,
63- \' Content-Type\' : \' application/json\'
59+ " Authorization" : apikey,
60+ " Content-Type": " application/json"
6461 }
6562 # key从官网申请 https://langsearch.com/
6663 response = requests.request("POST", url, headers=headers, data=payload)
6764 if response.status_code == 200:
68- return str( response.json() )
65+ return response.json()
6966 else:
7067 raise Exception(f"API请求失败: {response.status_code}, 错误信息: {response.text}")
71- return(response.text)', '{"{\" name\" : \" query\" , \" type\" : \" string\" , \" source\" : \" reference\" , \" is_required\" : true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', true, 'PUBLIC', 'INTERNAL', '/src/assets/fx/langsearch/icon.png', 'DGp5NooY3zGFJjzQ3t+uscqoTZbZHax2RdHvfyZ6NCcb/5JhcJHsB9rzCoGjQVvewugnFzjIdATJcryhjis3enkl4l1TAFdOxDT7Py63JpuOapoE52pkhsE9QYW5f1tg6Nd9gssYY6rYnyqMvSf4wUjQJBDQOxv29+CqRCTWSUnQfHD8aWUaPe4rXZObdFnLLg42ROg8cVu5UJkJXdA6EcRF8G082NqQ+LOB49OSffkfhg+fk4nibKIvYcFo3Y1MP+bTuqO23O5tzbNUnPmqsqGPnxbJqZmvJvkksZg1L/NTzYSvvZYuPNUbGfR7wC9FucFN/TFFRMGFdCxtiXGlUQhrZvz8W5vjMKlzsRfnKXTFS4Cg62MmCvQFK6yybLMx0QMOc/yftFt4MkZdLepjim08ctLav3mNApaFNtZ0Isz+A40jpimrZkj5Ahg1KpXCQXUQyOtmQXc6MUVVFOzFlXTQfa3ua4tkiAdAwZEHvaYgjQh28dq4nrtgqFhe+hojJ7kIlJsqtPvb9/+RYwIWVlwef4jVDV2a3Eu+1fMlid1ZJT/KwNkCv2179jRaYhXGkXfU8ii1OOhL9mIGtSJ5lThuJouXgQvNyRr7MajMCVDZYUEOf+kolH/SWEtCFxImT4zaMVFcuZyzLWGh48BX9KuKoAhfPToSs4RgTk0G9h1hQqCrZP4GSXXiBgpMiz2niFGmWk1oWRa6XfU3Dy3Xkft4Q1+iQbnSXcfzZggYoZ4g6qbaf7iBUKN6mW/BvLbSVuqftgy9KF1dHMD95bSMBX6o47rJyAUbaJduLRsH086uNTDTaIE2f/F0ahD5WbokCQGzhWp6W8h4YgIcj8SC3uHiyCOeW5nIm/zEM2+bY4BuClr1IuvYR32GBu0wDma1f7gxEU7Exu49oDojjSdOaFb8isvsaJ9dCNOP/V/ONldBS9VOcZ9l4RNawWwLhrzZhhml5TUI5ZCUywHDFqu/0uBnTI1AHlg+NAs4iJ4VZoVJztZrQmNa9etbRWvhU8yd', null);
72- """
68+ return (response.text)', '{"{\\ "name\\ ": \\ "query\\ ", \\ "type\\ ": \\ "string\\ ", \\ "source\\ ": \\ "reference\\ ", \\ "is_required\\ ": true}"}', 'f0dd8f71-e4ee-11ee-8c84-a8a1595801ab', TRUE, 'PUBLIC', 'INTERNAL', '/src/assets/fx/langsearch/icon.png', '[{"attrs": {"type": "password", "maxlength": 200, "minlength": 1, "show-password": true, "show-word-limit": true}, "field": "apikey", "label": "apikey", "required": true, "input_type": "PasswordInput", "props_info": {"rules": [{"message": "apikey 为必填属性", "required": true}, {"max": 200, "min": 1, "message": "apikey长度在 1 到 200 个字符", "trigger": "blur"}]}, "default_value": "x", "show_default_value": false}]', '', NULL);
7369
70+ '''
7471
75- class Migration (migrations .Migration ):
7672
73+ class Migration (migrations .Migration ):
7774 dependencies = [
7875 ('function_lib' , '0002_functionlib_is_active_functionlib_permission_type' ),
7976 ]
@@ -82,17 +79,24 @@ class Migration(migrations.Migration):
8279 migrations .AddField (
8380 model_name = 'functionlib' ,
8481 name = 'function_type' ,
85- field = models .CharField (choices = [('INTERNAL' , '内置' ), ('PUBLIC' , '公开' )], default = 'PUBLIC' , max_length = 20 , verbose_name = '函数类型' ),
82+ field = models .CharField (choices = [('INTERNAL' , '内置' ), ('PUBLIC' , '公开' )],
83+ default = 'PUBLIC' , max_length = 20 , verbose_name = '函数类型' ),
8684 ),
8785 migrations .AddField (
8886 model_name = 'functionlib' ,
8987 name = 'icon' ,
90- field = models .CharField (default = '/ui/favicon.ico' , max_length = 256 , verbose_name = '函数库icon' ),
88+ field = models .CharField (default = '/ui/favicon.ico' , max_length = 256 ,
89+ verbose_name = '函数库icon' ),
9190 ),
9291 migrations .AddField (
9392 model_name = 'functionlib' ,
9493 name = 'init_field_list' ,
95- field = models .CharField (max_length = 102400 , null = True , verbose_name = '启动字段列表' ),
94+ field = models .JSONField (default = list , verbose_name = '启动字段列表' ),
95+ ),
96+ migrations .AddField (
97+ model_name = 'functionlib' ,
98+ name = 'init_params' ,
99+ field = models .CharField (max_length = 102400 , null = True , verbose_name = '初始化参数' ),
96100 ),
97101 migrations .AddField (
98102 model_name = 'functionlib' ,
0 commit comments