* Zhipu sdk update 适配最新的智谱SDK,支持GLM4v (#1502) * 适配 google gemini 优化为从用户input中提取文件 * 适配最新的智谱SDK、支持glm-4v * requirements.txt fix * pending history check --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> * Update "生成多种Mermaid图表" plugin: Separate out the file reading function (#1520) * Update crazy_functional.py with new functionality deal with PDF * Update crazy_functional.py and Mermaid.py for plugin_kwargs * Update crazy_functional.py with new chart type: mind map * Update SELECT_PROMPT and i_say_show_user messages * Update ArgsReminder message in get_crazy_functions() function * Update with read md file and update PROMPTS * Return the PROMPTS as the test found that the initial version worked best * Update Mermaid chart generation function * version 3.71 * 解决issues #1510 * Remove unnecessary text from sys_prompt in 解析历史输入 function * Remove sys_prompt message in 解析历史输入 function * Update bridge_all.py: supports gpt-4-turbo-preview (#1517) * Update bridge_all.py: supports gpt-4-turbo-preview supports gpt-4-turbo-preview * Update bridge_all.py --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * Update config.py: supports gpt-4-turbo-preview (#1516) * Update config.py: supports gpt-4-turbo-preview supports gpt-4-turbo-preview * Update config.py --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * Refactor 解析历史输入 function to handle file input * Update Mermaid chart generation functionality * rename files and functions --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> Co-authored-by: hongyi-zhao <hongyi.zhao@gmail.com> Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * 接入mathpix ocr功能 (#1468) * Update Latex输出PDF结果.py 借助mathpix实现了PDF翻译中文并重新编译PDF * Update config.py add mathpix appid & appkey * Add 'PDF翻译中文并重新编译PDF' feature to plugins. --------- Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * fix zhipuai * check picture * remove glm-4 due to bug * 修改config * 检查MATHPIX_APPID * Remove unnecessary code and update function_plugins dictionary * capture non-standard token overflow * bug fix #1524 * change mermaid style * 支持mermaid 滚动放大缩小重置,鼠标滚动和拖拽 (#1530) * 支持mermaid 滚动放大缩小重置,鼠标滚动和拖拽 * 微调未果 先stage一下 * update --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> Co-authored-by: binary-husky <96192199+binary-husky@users.noreply.github.com> * ver 3.72 * change live2d * save the status of ``clear btn` in cookie * 前端选择保持 * js ui bug fix * reset btn bug fix * update live2d tips * fix missing get_token_num method * fix live2d toggle switch * fix persistent custom btn with cookie * fix zhipuai feedback with core functionality * Refactor button update and clean up functions * tailing space removal * Fix missing MATHPIX_APPID and MATHPIX_APPKEY configuration * Prompt fix、脑图提示词优化 (#1537) * 适配 google gemini 优化为从用户input中提取文件 * 脑图提示词优化 * Fix missing MATHPIX_APPID and MATHPIX_APPKEY configuration --------- Co-authored-by: binary-husky <qingxu.fu@outlook.com> * 优化“PDF翻译中文并重新编译PDF”插件 (#1602) * Add gemini_endpoint to API_URL_REDIRECT (#1560) * Add gemini_endpoint to API_URL_REDIRECT * Update gemini-pro and gemini-pro-vision model_info endpoints * Update to support new claude models (#1606) * Add anthropic library and update claude models * 更新bridge_claude.py文件,添加了对图片输入的支持。修复了一些bug。 * 添加Claude_3_Models变量以限制图片数量 * Refactor code to improve readability and maintainability * minor claude bug fix * more flexible one-api support * reformat config * fix one-api new access bug * dummy * compat non-standard api * version 3.73 --------- Co-authored-by: XIao <46100050+Kilig947@users.noreply.github.com> Co-authored-by: Menghuan1918 <menghuan2003@outlook.com> Co-authored-by: hongyi-zhao <hongyi.zhao@gmail.com> Co-authored-by: Hao Ma <893017927@qq.com> Co-authored-by: zeyuan huang <599012428@qq.com>
112 lines
4.0 KiB
Python
112 lines
4.0 KiB
Python
"""
|
||
https://github.com/langchain-ai/langchain/blob/master/docs/extras/modules/model_io/output_parsers/pydantic.ipynb
|
||
|
||
Example 1.
|
||
|
||
# Define your desired data structure.
|
||
class Joke(BaseModel):
|
||
setup: str = Field(description="question to set up a joke")
|
||
punchline: str = Field(description="answer to resolve the joke")
|
||
|
||
# You can add custom validation logic easily with Pydantic.
|
||
@validator("setup")
|
||
def question_ends_with_question_mark(cls, field):
|
||
if field[-1] != "?":
|
||
raise ValueError("Badly formed question!")
|
||
return field
|
||
|
||
|
||
Example 2.
|
||
|
||
# Here's another example, but with a compound typed field.
|
||
class Actor(BaseModel):
|
||
name: str = Field(description="name of an actor")
|
||
film_names: List[str] = Field(description="list of names of films they starred in")
|
||
"""
|
||
|
||
import json, re, logging
|
||
|
||
|
||
PYDANTIC_FORMAT_INSTRUCTIONS = """The output should be formatted as a JSON instance that conforms to the JSON schema below.
|
||
|
||
As an example, for the schema {{"properties": {{"foo": {{"title": "Foo", "description": "a list of strings", "type": "array", "items": {{"type": "string"}}}}}}, "required": ["foo"]}}
|
||
the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of the schema. The object {{"properties": {{"foo": ["bar", "baz"]}}}} is not well-formatted.
|
||
|
||
Here is the output schema:
|
||
```
|
||
{schema}
|
||
```"""
|
||
|
||
|
||
PYDANTIC_FORMAT_INSTRUCTIONS_SIMPLE = """The output should be formatted as a JSON instance that conforms to the JSON schema below.
|
||
```
|
||
{schema}
|
||
```"""
|
||
|
||
class JsonStringError(Exception): ...
|
||
|
||
class GptJsonIO():
|
||
|
||
def __init__(self, schema, example_instruction=True):
|
||
self.pydantic_object = schema
|
||
self.example_instruction = example_instruction
|
||
self.format_instructions = self.generate_format_instructions()
|
||
|
||
def generate_format_instructions(self):
|
||
schema = self.pydantic_object.schema()
|
||
|
||
# Remove extraneous fields.
|
||
reduced_schema = schema
|
||
if "title" in reduced_schema:
|
||
del reduced_schema["title"]
|
||
if "type" in reduced_schema:
|
||
del reduced_schema["type"]
|
||
# Ensure json in context is well-formed with double quotes.
|
||
if self.example_instruction:
|
||
schema_str = json.dumps(reduced_schema)
|
||
return PYDANTIC_FORMAT_INSTRUCTIONS.format(schema=schema_str)
|
||
else:
|
||
return PYDANTIC_FORMAT_INSTRUCTIONS_SIMPLE.format(schema=schema_str)
|
||
|
||
def generate_output(self, text):
|
||
# Greedy search for 1st json candidate.
|
||
match = re.search(
|
||
r"\{.*\}", text.strip(), re.MULTILINE | re.IGNORECASE | re.DOTALL
|
||
)
|
||
json_str = ""
|
||
if match: json_str = match.group()
|
||
json_object = json.loads(json_str, strict=False)
|
||
final_object = self.pydantic_object.parse_obj(json_object)
|
||
return final_object
|
||
|
||
def generate_repair_prompt(self, broken_json, error):
|
||
prompt = "Fix a broken json string.\n\n" + \
|
||
"(1) The broken json string need to fix is: \n\n" + \
|
||
"```" + "\n" + \
|
||
broken_json + "\n" + \
|
||
"```" + "\n\n" + \
|
||
"(2) The error message is: \n\n" + \
|
||
error + "\n\n" + \
|
||
"Now, fix this json string. \n\n"
|
||
return prompt
|
||
|
||
def generate_output_auto_repair(self, response, gpt_gen_fn):
|
||
"""
|
||
response: string containing canidate json
|
||
gpt_gen_fn: gpt_gen_fn(inputs, sys_prompt)
|
||
"""
|
||
try:
|
||
result = self.generate_output(response)
|
||
except Exception as e:
|
||
try:
|
||
logging.info(f'Repairing json:{response}')
|
||
repair_prompt = self.generate_repair_prompt(broken_json = response, error=repr(e))
|
||
result = self.generate_output(gpt_gen_fn(repair_prompt, self.format_instructions))
|
||
logging.info('Repaire json success.')
|
||
except Exception as e:
|
||
# 没辙了,放弃治疗
|
||
logging.info('Repaire json fail.')
|
||
raise JsonStringError('Cannot repair json.', str(e))
|
||
return result
|
||
|