pro-craft 0.1.25__tar.gz → 0.1.27__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pro-craft might be problematic. Click here for more details.

Files changed (28) hide show
  1. {pro_craft-0.1.25 → pro_craft-0.1.27}/PKG-INFO +1 -1
  2. {pro_craft-0.1.25 → pro_craft-0.1.27}/pyproject.toml +1 -1
  3. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/database.py +3 -5
  4. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/prompt_craft/async_.py +131 -12
  5. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/prompt_craft/new.py +3 -3
  6. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/prompt_craft/sync.py +3 -3
  7. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/server/router/prompt.py +3 -3
  8. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft.egg-info/PKG-INFO +1 -1
  9. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft.egg-info/SOURCES.txt +0 -1
  10. pro_craft-0.1.25/src/pro_craft/prompt_craft/evals.py +0 -61
  11. {pro_craft-0.1.25 → pro_craft-0.1.27}/README.md +0 -0
  12. {pro_craft-0.1.25 → pro_craft-0.1.27}/setup.cfg +0 -0
  13. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/__init__.py +0 -0
  14. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/code_helper/coder.py +0 -0
  15. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/code_helper/designer.py +0 -0
  16. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/file_manager.py +0 -0
  17. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/log.py +0 -0
  18. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/prompt_craft/__init__.py +0 -0
  19. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/server/mcp/__init__.py +0 -0
  20. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/server/mcp/prompt.py +0 -0
  21. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/server/router/__init__.py +0 -0
  22. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft/utils.py +0 -0
  23. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft.egg-info/dependency_links.txt +0 -0
  24. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft.egg-info/requires.txt +0 -0
  25. {pro_craft-0.1.25 → pro_craft-0.1.27}/src/pro_craft.egg-info/top_level.txt +0 -0
  26. {pro_craft-0.1.25 → pro_craft-0.1.27}/tests/test22.py +0 -0
  27. {pro_craft-0.1.25 → pro_craft-0.1.27}/tests/test_coder.py +0 -0
  28. {pro_craft-0.1.25 → pro_craft-0.1.27}/tests/test_designer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pro-craft
3
- Version: 0.1.25
3
+ Version: 0.1.27
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pro-craft"
3
- version = "0.1.25"
3
+ version = "0.1.27"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -72,7 +72,7 @@ PromptBase = declarative_base()
72
72
 
73
73
  class SyncMetadata(PromptBase):
74
74
  """用于存储同步元数据的表模型"""
75
- __tablename__ = "sync_metadata"
75
+ __tablename__ = "ai_sync_metadata"
76
76
  id = Column(Integer, primary_key=True, autoincrement=True)
77
77
  last_sync_time = Column(DateTime, default=datetime(1970, 1, 1))
78
78
  table_name = Column(String(255), unique=True)
@@ -80,9 +80,8 @@ class SyncMetadata(PromptBase):
80
80
  def __repr__(self):
81
81
  return f"<SyncMetadata(table_name='{self.table_name}', last_sync_time='{self.last_sync_time}')>"
82
82
 
83
-
84
83
  class Prompt(PromptBase):
85
- __tablename__ = 'prompts_table' # 数据库中的表名,你可以改成你希望的名字
84
+ __tablename__ = 'ai_prompts' # 数据库中的表名,你可以改成你希望的名字
86
85
  # __tablename__ = 'llm_prompt' # 数据库中的表名,你可以改成你希望的名字
87
86
 
88
87
  # 定义联合唯一约束
@@ -177,9 +176,8 @@ class Prompt(PromptBase):
177
176
  f"is_deleted='{self.is_deleted}...'>"
178
177
  )
179
178
 
180
-
181
179
  class UseCase(PromptBase):
182
- __tablename__ = 'usecase' # 数据库中的表名,你可以改成你希望的名字
180
+ __tablename__ = 'ai_usecase' # 数据库中的表名,你可以改成你希望的名字
183
181
 
184
182
  # id (int, primary_key=True, autoincrement=True)
185
183
  # 你的属性表中 id 为 int, true (not null), true (primary key), 0 (length), ASC (key order), true (auto increment)
@@ -34,6 +34,8 @@ class IntellectRemoveError(Exception):
34
34
  pass
35
35
 
36
36
  BATCH_SIZE = 100
37
+ MIN_SUCCESS_RATE = 00.0 # 这里定义通过阈值, 高于该比例则通过
38
+
37
39
 
38
40
  def slog(s, target: str = "target",logger = None):
39
41
  COLOR_GREEN = "\033[92m"
@@ -94,7 +96,7 @@ async def get_last_sync_time(target_session: AsyncSession) -> datetime:
94
96
  """从目标数据库获取上次同步时间"""
95
97
  # 修正点:使用 select() 和 execute()
96
98
  result = await target_session.execute(
97
- select(SyncMetadata).filter_by(table_name="sync_metadata")
99
+ select(SyncMetadata).filter_by(table_name="ai_sync_metadata")
98
100
  )
99
101
  metadata_entry = result.scalar_one_or_none() # 获取单个对象或 None
100
102
 
@@ -110,7 +112,7 @@ async def update_last_sync_time(target_session: AsyncSession, new_sync_time: dat
110
112
  """更新目标数据库的上次同步时间"""
111
113
  # 修正点:使用 select() 和 execute()
112
114
  result = await target_session.execute(
113
- select(SyncMetadata).filter_by(table_name="sync_metadata")
115
+ select(SyncMetadata).filter_by(table_name="ai_sync_metadata")
114
116
  )
115
117
  metadata_entry = result.scalar_one_or_none()
116
118
 
@@ -118,7 +120,7 @@ async def update_last_sync_time(target_session: AsyncSession, new_sync_time: dat
118
120
  metadata_entry.last_sync_time = new_sync_time
119
121
  else:
120
122
  # 如果不存在,则创建
121
- new_metadata = SyncMetadata(table_name="sync_metadata", last_sync_time=new_sync_time)
123
+ new_metadata = SyncMetadata(table_name="ai_sync_metadata", last_sync_time=new_sync_time)
122
124
  target_session.add(new_metadata)
123
125
 
124
126
  # 异步提交事务
@@ -128,6 +130,8 @@ async def update_last_sync_time(target_session: AsyncSession, new_sync_time: dat
128
130
 
129
131
 
130
132
 
133
+
134
+
131
135
  class IntellectType(Enum):
132
136
  train = "train"
133
137
  inference = "inference"
@@ -155,7 +159,7 @@ class AsyncIntel():
155
159
  pool_pre_ping=True, # 使用前检查连接活性
156
160
  pool_timeout=30 # 等待连接池中连接的最长时间(秒)
157
161
  )
158
-
162
+ self.create_specific_database(self.engine,["ai_prompts","ai_usecase"])
159
163
 
160
164
  if model_name in ["gemini-2.5-flash-preview-05-20-nothinking",]:
161
165
  self.llm = BianXieAdapter(model_name = model_name)
@@ -165,8 +169,23 @@ class AsyncIntel():
165
169
  print('Use BianXieAdapter')
166
170
  self.llm = BianXieAdapter()
167
171
 
168
- async def create_database(self):
169
- async with self.engine.begin() as conn:
172
+ async def create_specific_database(self,engine, tables_to_create_names: list[str]):
173
+ async with engine.begin() as conn:
174
+ # 从 metadata 中获取对应的 Table 对象
175
+ specific_database_objects = []
176
+ for table_name in tables_to_create_names:
177
+ if table_name in PromptBase.metadata.tables:
178
+ specific_database_objects.append(PromptBase.metadata.tables[table_name])
179
+ else:
180
+ print(f"Warning: Table '{table_name}' not found in metadata.")
181
+
182
+ if specific_database_objects:
183
+ await conn.run_sync(PromptBase.metadata.create_all, tables=specific_database_objects)
184
+ else:
185
+ print("No specific tables to create.")
186
+
187
+ async def create_database(self,engine):
188
+ async with engine.begin() as conn:
170
189
  await conn.run_sync(PromptBase.metadata.create_all)
171
190
 
172
191
  async def _get_latest_prompt_version(self,target_prompt_id,session):
@@ -214,9 +233,7 @@ class AsyncIntel():
214
233
 
215
234
  async def sync_prompt_data_to_database(self,database_url:str):
216
235
  target_engine = create_async_engine(database_url, echo=False)
217
- async with target_engine.begin() as conn:
218
- await conn.run_sync(PromptBase.metadata.create_all)
219
-
236
+ await self.create_database(target_engine)
220
237
  async with create_async_session(self.engine) as source_session:
221
238
  async with create_async_session(target_engine) as target_session:
222
239
 
@@ -364,6 +381,21 @@ class AsyncIntel():
364
381
  session.add(prompt1)
365
382
  await session.commit() # 提交事务,将数据写入数据库
366
383
 
384
+ async def get_use_case_by_sql(self,
385
+ target_prompt_id: str,
386
+ session = None
387
+ ):
388
+ """
389
+ 从sql保存提示词
390
+ """
391
+ stmt = select(UseCase).filter(UseCase.is_deleted == 0,
392
+ UseCase.prompt_id == target_prompt_id)
393
+
394
+ result = await session.execute(stmt)
395
+ # use_case = result.scalars().one_or_none()
396
+ use_case = result.scalars().all()
397
+ return use_case
398
+
367
399
  async def save_use_case_by_sql(self,
368
400
  prompt_id: str,
369
401
  use_case:str = "",
@@ -374,6 +406,8 @@ class AsyncIntel():
374
406
  """
375
407
  从sql保存提示词
376
408
  """
409
+ #TODO 存之前保证数据库中相同的prompt_id中没有重复的use_case
410
+
377
411
  use_case = UseCase(prompt_id=prompt_id,
378
412
  use_case = use_case,
379
413
  output = output,
@@ -789,7 +823,6 @@ class AsyncIntel():
789
823
  )
790
824
 
791
825
  try:
792
-
793
826
  json_str = extract_(ai_result,r'json')
794
827
  # json_str = fix_broken_json_string(json_str)
795
828
  ai_result = json.loads(json_str)
@@ -804,7 +837,7 @@ class AsyncIntel():
804
837
  OutputFormat(**ai_result)
805
838
 
806
839
  except JSONDecodeError as e:
807
- raise IntellectRemoveFormatError(f"prompt_id: {prompt_id} 在生成后做json解析时报错") from e
840
+ raise IntellectRemoveFormatError(f"prompt_id: {prompt_id} 生成的内容为无法被Json解析 {e}") from e
808
841
 
809
842
  except ValidationError as e:
810
843
  err_info = e.errors()[0]
@@ -845,7 +878,6 @@ class AsyncIntel():
845
878
  )
846
879
  results = await asyncio.gather(*tasks, return_exceptions=False)
847
880
  return results
848
-
849
881
 
850
882
  def intellect_remove_warp(self,prompt_id: str):
851
883
  def outer_packing(func):
@@ -874,3 +906,90 @@ class AsyncIntel():
874
906
  return result
875
907
  return wrapper
876
908
  return outer_packing
909
+
910
+ async def intellect_remove_format_eval(self,
911
+ OutputFormat: object,
912
+ prompt_id: str,
913
+ ExtraFormats: list[object] = [],
914
+ version: str = None,
915
+ ):
916
+
917
+ async with create_async_session(self.engine) as session:
918
+ use_cases = await self.get_use_case_by_sql(target_prompt_id=prompt_id,session=session)
919
+ prompt_result = await self.get_prompts_from_sql(prompt_id=prompt_id,
920
+ session=session)
921
+ if prompt_result is None:
922
+ raise IntellectRemoveError("不存在的prompt_id")
923
+ if prompt_result.action_type != "inference":
924
+ raise IntellectRemoveError("请在inference模式下使用次类")
925
+
926
+
927
+ total_assertions = len(use_cases)
928
+ result_cases = []
929
+
930
+ async def evals_func(use_case,prompt_id,OutputFormat,ExtraFormats,version):
931
+ try:
932
+ # 这里将参数传入
933
+ await self.intellect_remove_format(
934
+ input_data = use_case.use_case,
935
+ prompt_id = prompt_id,
936
+ OutputFormat = OutputFormat,
937
+ ExtraFormats = ExtraFormats,
938
+ version = version,
939
+ inference_save_case = False,
940
+ )
941
+ # TODO base_eval
942
+ # TODO 人类评价 eval
943
+ # TODO llm 评价 eval
944
+ result_cases.append({"type":"Successful","case":use_case.use_case,"reply":f"pass"})
945
+ use_case.output = "Successful"
946
+ except IntellectRemoveFormatError as e:
947
+ result_cases.append({"type":"FAILED","case":use_case.use_case,"reply":f"{e}"})
948
+ use_case.output = f"{"FAILED"}-{e}"
949
+ except Exception as e: # 捕获其他可能的错误
950
+ result_cases.append({"type":"FAILED","case":use_case.use_case,"reply":f"Exp {e}"})
951
+ use_case.output = f"{"FAILED"}-{e}"
952
+ await session.commit()
953
+
954
+ tasks = []
955
+ for use_case in use_cases:
956
+ tasks.append(
957
+ evals_func(
958
+ use_case = use_case,
959
+ prompt_id = prompt_id,
960
+ OutputFormat = OutputFormat,
961
+ ExtraFormats = ExtraFormats,
962
+ version = version
963
+ )
964
+ )
965
+ await asyncio.gather(*tasks, return_exceptions=False)
966
+
967
+
968
+ successful_assertions = 0
969
+ bad_case = []
970
+ for i in result_cases:
971
+ if i['type'] == "Successful":
972
+ successful_assertions += 1
973
+ else:
974
+ bad_case.append(i)
975
+
976
+ success_rate = (successful_assertions / total_assertions) * 100
977
+ print(f"\n--- Aggregated Results ---")
978
+ print(f"Total test cases: {total_assertions}")
979
+ print(f"Successful cases: {successful_assertions}")
980
+ print(f"Success Rate: {success_rate:.2f}%")
981
+
982
+ # if success_rate >= MIN_SUCCESS_RATE:
983
+ # return "通过", json.dumps(result_cases,ensure_ascii=False)
984
+ # else:
985
+ # return "未通过",json.dumps(result_cases,ensure_ascii=False)
986
+
987
+ print(bad_case)
988
+
989
+
990
+ # return results
991
+
992
+
993
+
994
+
995
+ # 整体测试d, 测试未通过d, 大模型调整再测试, 依旧不通过, 大模型裂变, 仍不通过, 互换人力
@@ -37,19 +37,19 @@ def slog(s, target: str = "target",logger = None):
37
37
 
38
38
  def get_last_sync_time(target_session) -> datetime:
39
39
  """从目标数据库获取上次同步时间"""
40
- metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="sync_metadata").first()
40
+ metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="ai_sync_metadata").first()
41
41
  if metadata_entry:
42
42
  return metadata_entry.last_sync_time
43
43
  return datetime(1970, 1, 1) # 默认一个很早的时间
44
44
 
45
45
  def update_last_sync_time(target_session, new_sync_time: datetime):
46
46
  """更新目标数据库的上次同步时间"""
47
- metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="sync_metadata").first()
47
+ metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="ai_sync_metadata").first()
48
48
  if metadata_entry:
49
49
  metadata_entry.last_sync_time = new_sync_time
50
50
  else:
51
51
  # 如果不存在,则创建
52
- new_metadata = SyncMetadata(table_name="sync_metadata", last_sync_time=new_sync_time)
52
+ new_metadata = SyncMetadata(table_name="ai_sync_metadata", last_sync_time=new_sync_time)
53
53
  target_session.add(new_metadata)
54
54
  target_session.commit()
55
55
  print(f"Updated last sync time to: {new_sync_time}")
@@ -39,19 +39,19 @@ def slog(s, target: str = "target",logger = None):
39
39
 
40
40
  def get_last_sync_time(target_session) -> datetime:
41
41
  """从目标数据库获取上次同步时间"""
42
- metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="sync_metadata").first()
42
+ metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="ai_sync_metadata").first()
43
43
  if metadata_entry:
44
44
  return metadata_entry.last_sync_time
45
45
  return datetime(1970, 1, 1) # 默认一个很早的时间
46
46
 
47
47
  def update_last_sync_time(target_session, new_sync_time: datetime):
48
48
  """更新目标数据库的上次同步时间"""
49
- metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="sync_metadata").first()
49
+ metadata_entry = target_session.query(SyncMetadata).filter_by(table_name="ai_sync_metadata").first()
50
50
  if metadata_entry:
51
51
  metadata_entry.last_sync_time = new_sync_time
52
52
  else:
53
53
  # 如果不存在,则创建
54
- new_metadata = SyncMetadata(table_name="sync_metadata", last_sync_time=new_sync_time)
54
+ new_metadata = SyncMetadata(table_name="ai_sync_metadata", last_sync_time=new_sync_time)
55
55
  target_session.add(new_metadata)
56
56
  target_session.commit()
57
57
  print(f"Updated last sync time to: {new_sync_time}")
@@ -2,7 +2,7 @@
2
2
 
3
3
  from fastapi import APIRouter
4
4
  from pro_craft import Intel,AsyncIntel
5
- from pro_craft.utils import create_session
5
+ from pro_craft.utils import create_async_session
6
6
 
7
7
  def create_router(database_url: str,
8
8
  slave_database_url: str,
@@ -44,7 +44,7 @@ def create_router(database_url: str,
44
44
 
45
45
  @router.get("/get_latest_prompt")
46
46
  async def get_latest_prompt(prompt_id: str):
47
- with create_session(intels.engine) as session:
47
+ async with create_async_session(intels.engine) as session:
48
48
  result = await intels.get_prompts_from_sql(
49
49
  prompt_id=prompt_id,
50
50
  session=session
@@ -59,7 +59,7 @@ def create_router(database_url: str,
59
59
 
60
60
  @router.get("/roll_back")
61
61
  async def roll_back(prompt_id:str,version:str):
62
- with create_session(intels.engine) as session:
62
+ async with create_async_session(intels.engine) as session:
63
63
  result = await intels.get_prompts_from_sql(
64
64
  prompt_id=prompt_id,
65
65
  version = version,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pro-craft
3
- Version: 0.1.25
3
+ Version: 0.1.27
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
@@ -14,7 +14,6 @@ src/pro_craft/code_helper/coder.py
14
14
  src/pro_craft/code_helper/designer.py
15
15
  src/pro_craft/prompt_craft/__init__.py
16
16
  src/pro_craft/prompt_craft/async_.py
17
- src/pro_craft/prompt_craft/evals.py
18
17
  src/pro_craft/prompt_craft/new.py
19
18
  src/pro_craft/prompt_craft/sync.py
20
19
  src/pro_craft/server/mcp/__init__.py
@@ -1,61 +0,0 @@
1
-
2
- import json
3
-
4
-
5
- ############evals##############
6
-
7
- # 异步
8
- class Base_Evals():
9
- def __init__(self):
10
- """
11
- # TODO 2 自动优化prompt 并提升稳定性, 并测试
12
- 通过重写继承来使用它
13
- """
14
- self.MIN_SUCCESS_RATE = 00.0 # 这里定义通过阈值, 高于该比例则通过
15
-
16
-
17
- async def _assert_eval_function(self,params):
18
- #这里定义函数的评价体系
19
- print(params,'params')
20
-
21
- async def get_success_rate(self,test_cases:list[tuple]):
22
- """
23
- # 这里定义数据
24
-
25
- """
26
-
27
- successful_assertions = 0
28
- total_assertions = len(test_cases)
29
- result_cases = []
30
-
31
- for i, params in enumerate(test_cases):
32
- try:
33
- # 这里将参数传入
34
- await self._assert_eval_function(params)
35
- successful_assertions += 1
36
- result_cases.append({"type":"Successful","--input--":params,"evaluate_info":f"满足要求"})
37
- except AssertionError as e:
38
- result_cases.append({"type":"FAILED","--input--":params,"evaluate_info":f"ERROR {e}"})
39
- except Exception as e: # 捕获其他可能的错误
40
- result_cases.append({"type":"FAILED","--input--":params,"evaluate_info":f"ERROR {e}"})
41
-
42
-
43
- success_rate = (successful_assertions / total_assertions) * 100
44
- print(f"\n--- Aggregated Results ---")
45
- print(f"Total test cases: {total_assertions}")
46
- print(f"Successful cases: {successful_assertions}")
47
- print(f"Success Rate: {success_rate:.2f}%")
48
-
49
- if success_rate >= self.MIN_SUCCESS_RATE:
50
- return "通过", json.dumps(result_cases,ensure_ascii=False)
51
- else:
52
- return "未通过",json.dumps(result_cases,ensure_ascii=False)
53
-
54
-
55
- def global_evals():
56
- pass
57
-
58
-
59
-
60
-
61
-
File without changes
File without changes
File without changes