beswarm 0.1.12__tar.gz → 0.1.13__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.
- {beswarm-0.1.12 → beswarm-0.1.13}/PKG-INFO +1 -1
- beswarm-0.1.13/beswarm/aient/main.py +50 -0
- beswarm-0.1.13/beswarm/aient/setup.py +15 -0
- beswarm-0.1.13/beswarm/aient/src/aient/__init__.py +1 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/__init__.py +1 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/log_config.py +6 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/models.py +232 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/request.py +1665 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/response.py +617 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/test/test_base_api.py +18 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/test/test_image.py +15 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/test/test_payload.py +92 -0
- beswarm-0.1.13/beswarm/aient/src/aient/core/utils.py +715 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/__init__.py +9 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/audio.py +63 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/base.py +251 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/chatgpt.py +938 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/claude.py +640 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/duckduckgo.py +241 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/gemini.py +357 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/groq.py +268 -0
- beswarm-0.1.13/beswarm/aient/src/aient/models/vertex.py +420 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/__init__.py +33 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/arXiv.py +48 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/config.py +172 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/excute_command.py +35 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/get_time.py +19 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/image.py +72 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/list_directory.py +50 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/read_file.py +79 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/registry.py +116 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/run_python.py +156 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/websearch.py +394 -0
- beswarm-0.1.13/beswarm/aient/src/aient/plugins/write_file.py +51 -0
- beswarm-0.1.13/beswarm/aient/src/aient/prompt/__init__.py +1 -0
- beswarm-0.1.13/beswarm/aient/src/aient/prompt/agent.py +280 -0
- beswarm-0.1.13/beswarm/aient/src/aient/utils/__init__.py +0 -0
- beswarm-0.1.13/beswarm/aient/src/aient/utils/prompt.py +143 -0
- beswarm-0.1.13/beswarm/aient/src/aient/utils/scripts.py +721 -0
- beswarm-0.1.13/beswarm/aient/test/chatgpt.py +161 -0
- beswarm-0.1.13/beswarm/aient/test/claude.py +32 -0
- beswarm-0.1.13/beswarm/aient/test/test.py +2 -0
- beswarm-0.1.13/beswarm/aient/test/test_API.py +6 -0
- beswarm-0.1.13/beswarm/aient/test/test_Deepbricks.py +20 -0
- beswarm-0.1.13/beswarm/aient/test/test_Web_crawler.py +262 -0
- beswarm-0.1.13/beswarm/aient/test/test_aiwaves.py +25 -0
- beswarm-0.1.13/beswarm/aient/test/test_aiwaves_arxiv.py +19 -0
- beswarm-0.1.13/beswarm/aient/test/test_ask_gemini.py +8 -0
- beswarm-0.1.13/beswarm/aient/test/test_class.py +17 -0
- beswarm-0.1.13/beswarm/aient/test/test_claude.py +23 -0
- beswarm-0.1.13/beswarm/aient/test/test_claude_zh_char.py +26 -0
- beswarm-0.1.13/beswarm/aient/test/test_ddg_search.py +50 -0
- beswarm-0.1.13/beswarm/aient/test/test_download_pdf.py +56 -0
- beswarm-0.1.13/beswarm/aient/test/test_gemini.py +97 -0
- beswarm-0.1.13/beswarm/aient/test/test_get_token_dict.py +21 -0
- beswarm-0.1.13/beswarm/aient/test/test_google_search.py +35 -0
- beswarm-0.1.13/beswarm/aient/test/test_jieba.py +32 -0
- beswarm-0.1.13/beswarm/aient/test/test_json.py +65 -0
- beswarm-0.1.13/beswarm/aient/test/test_langchain_search_old.py +235 -0
- beswarm-0.1.13/beswarm/aient/test/test_logging.py +32 -0
- beswarm-0.1.13/beswarm/aient/test/test_ollama.py +55 -0
- beswarm-0.1.13/beswarm/aient/test/test_plugin.py +16 -0
- beswarm-0.1.13/beswarm/aient/test/test_py_run.py +26 -0
- beswarm-0.1.13/beswarm/aient/test/test_requests.py +162 -0
- beswarm-0.1.13/beswarm/aient/test/test_search.py +18 -0
- beswarm-0.1.13/beswarm/aient/test/test_tikitoken.py +19 -0
- beswarm-0.1.13/beswarm/aient/test/test_token.py +94 -0
- beswarm-0.1.13/beswarm/aient/test/test_url.py +33 -0
- beswarm-0.1.13/beswarm/aient/test/test_whisper.py +14 -0
- beswarm-0.1.13/beswarm/aient/test/test_wildcard.py +20 -0
- beswarm-0.1.13/beswarm/aient/test/test_yjh.py +21 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm.egg-info/PKG-INFO +1 -1
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm.egg-info/SOURCES.txt +70 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/pyproject.toml +1 -1
- {beswarm-0.1.12 → beswarm-0.1.13}/MANIFEST.in +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/README.md +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/__init__.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/README.md +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/__init__.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/edit_file.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/planner.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/repomap.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/search_arxiv.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/think.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/tools/worker.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm/utils.py +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm.egg-info/dependency_links.txt +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm.egg-info/requires.txt +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/beswarm.egg-info/top_level.txt +0 -0
- {beswarm-0.1.12 → beswarm-0.1.13}/setup.cfg +0 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
import os
|
2
|
+
from datetime import datetime
|
3
|
+
|
4
|
+
from src.aient.utils import prompt
|
5
|
+
from src.aient.models import chatgpt, claude3, gemini, groq
|
6
|
+
LANGUAGE = os.environ.get('LANGUAGE', 'Simplified Chinese')
|
7
|
+
GPT_ENGINE = os.environ.get('GPT_ENGINE', 'gpt-4-turbo-2024-04-09')
|
8
|
+
|
9
|
+
API = os.environ.get('API', None)
|
10
|
+
API_URL = os.environ.get('API_URL', None)
|
11
|
+
|
12
|
+
CLAUDE_API = os.environ.get('CLAUDE_API', None)
|
13
|
+
GOOGLE_AI_API_KEY = os.environ.get('GOOGLE_AI_API_KEY', None)
|
14
|
+
GROQ_API_KEY = os.environ.get('GROQ_API_KEY', None)
|
15
|
+
|
16
|
+
current_date = datetime.now()
|
17
|
+
Current_Date = current_date.strftime("%Y-%m-%d")
|
18
|
+
|
19
|
+
message = "https://arxiv.org/abs/2404.02041 这篇论文讲了啥?"
|
20
|
+
systemprompt = os.environ.get('SYSTEMPROMPT', prompt.chatgpt_system_prompt)
|
21
|
+
# systemprompt = os.environ.get('SYSTEMPROMPT', prompt.system_prompt.format(LANGUAGE, Current_Date))
|
22
|
+
# systemprompt = (
|
23
|
+
# "你是一位旅行专家。你可以规划旅行行程,如果用户有预算限制,还需要查询机票价格。结合用户的出行时间,给出合理的行程安排。"
|
24
|
+
# "在规划行程之前,必须先查找旅行攻略搜索景点信息,即使用 get_city_tarvel_info 查询景点信息。查询攻略后,你需要分析用户个性化需求给出合理的行程安排。充分考虑用户的年龄,情侣,家庭,朋友,儿童,独自旅行等情况。"
|
25
|
+
# "你需要根据用户给出的地点和预算,给出真实准确的行程,包括游玩时长、景点之间的交通方式和移动距离,每天都要给出总的游玩时间。"
|
26
|
+
# "给用户介绍景点的时候,根据查到的景点介绍结合你自己的知识,景点介绍尽量丰富精彩,吸引用户眼球,不要直接复述查到的景点介绍。"
|
27
|
+
# "尽量排满用户的行程,不要有太多空闲时间。"
|
28
|
+
# "你还可以根据用户的需求,给出一些旅行建议。"
|
29
|
+
# )
|
30
|
+
bot = chatgpt(api_key=API, api_url=API_URL , engine=GPT_ENGINE, system_prompt=systemprompt)
|
31
|
+
# bot = claude3(api_key=CLAUDE_API, engine=GPT_ENGINE, system_prompt=systemprompt)
|
32
|
+
# bot = gemini(api_key=GOOGLE_AI_API_KEY, engine=GPT_ENGINE, system_prompt=systemprompt)
|
33
|
+
# bot = groq(api_key=GROQ_API_KEY, engine=GPT_ENGINE, system_prompt=systemprompt)
|
34
|
+
for text in bot.ask_stream(message):
|
35
|
+
# for text in bot.ask_stream("今天的微博热搜有哪些?"):
|
36
|
+
# for text in bot.ask_stream("250m usd = cny"):
|
37
|
+
# for text in bot.ask_stream("我在广州市,想周一去香港,周四早上回来,是去游玩,请你帮我规划整个行程。包括细节,如交通,住宿,餐饮,价格,等等,最好细节到每天各个部分的时间,花费,等等,尽量具体,用户一看就能直接执行的那种"):
|
38
|
+
# for text in bot.ask_stream("英伟达最早支持杜比视界的显卡是哪一代"):
|
39
|
+
# for text in bot.ask_stream("100个斐波纳切数列的和是多少"):
|
40
|
+
# for text in bot.ask_stream("上海有哪些好玩的地方?"):
|
41
|
+
# for text in bot.ask_stream("https://arxiv.org/abs/2404.02041 这篇论文讲了啥?"):
|
42
|
+
# for text in bot.ask_stream("今天伊朗总统目前的情况怎么样?"):
|
43
|
+
# for text in bot.ask_stream("我不是很懂y[..., 2],y[..., 2] - y[:, 0:1, 0:1, 2],y[:, 0:1, 0:1, 2]这些对张量的slice操作,给我一些练习demo代码,专门给我巩固这些张量复杂操作。让我从易到难理解透彻所有这样类型的张量操作。"):
|
44
|
+
# for text in bot.ask_stream("just say test"):
|
45
|
+
# for text in bot.ask_stream("画一只猫猫"):
|
46
|
+
# for text in bot.ask_stream("我在上海想去重庆旅游,我只有2000元预算,我想在重庆玩一周,你能帮我规划一下吗?"):
|
47
|
+
# for text in bot.ask_stream("我在上海想去重庆旅游,我有一天的时间。你能帮我规划一下吗?"):
|
48
|
+
print(text, end="")
|
49
|
+
|
50
|
+
# print("\n bot tokens usage", bot.tokens_usage)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from setuptools import setup, find_packages
|
4
|
+
|
5
|
+
setup(
|
6
|
+
name="aient",
|
7
|
+
version="1.0.73",
|
8
|
+
description="Aient: The Awakening of Agent.",
|
9
|
+
long_description=Path.open(Path("README.md"), encoding="utf-8").read(),
|
10
|
+
long_description_content_type="text/markdown",
|
11
|
+
packages=find_packages("src"),
|
12
|
+
package_dir={"": "src"},
|
13
|
+
install_requires=Path.open(Path("requirements.txt"), encoding="utf-8").read().splitlines(),
|
14
|
+
include_package_data=True,
|
15
|
+
)
|
@@ -0,0 +1 @@
|
|
1
|
+
from .models import *
|
@@ -0,0 +1 @@
|
|
1
|
+
# core package initialization file
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import logging
|
2
|
+
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
3
|
+
logger = logging.getLogger("uni-api")
|
4
|
+
|
5
|
+
logging.getLogger("httpx").setLevel(logging.CRITICAL)
|
6
|
+
logging.getLogger("watchfiles.main").setLevel(logging.CRITICAL)
|
@@ -0,0 +1,232 @@
|
|
1
|
+
from io import IOBase
|
2
|
+
from pydantic import BaseModel, Field, model_validator, ConfigDict
|
3
|
+
from typing import List, Dict, Optional, Union, Tuple, Literal, Any
|
4
|
+
|
5
|
+
class FunctionParameter(BaseModel):
|
6
|
+
type: str
|
7
|
+
properties: Dict[str, Dict[str, Any]]
|
8
|
+
required: List[str] = None
|
9
|
+
defs: Dict[str, Any] = Field(default=None, alias="$defs")
|
10
|
+
|
11
|
+
class Config:
|
12
|
+
population_by_name = True
|
13
|
+
|
14
|
+
class Function(BaseModel):
|
15
|
+
name: str
|
16
|
+
description: str = Field(default=None)
|
17
|
+
parameters: Optional[FunctionParameter] = Field(default=None, exclude=None)
|
18
|
+
|
19
|
+
class Tool(BaseModel):
|
20
|
+
type: str
|
21
|
+
function: Function
|
22
|
+
|
23
|
+
@classmethod
|
24
|
+
def parse_raw(cls, json_str: str) -> 'Tool':
|
25
|
+
"""从JSON字符串解析Tool对象"""
|
26
|
+
return cls.model_validate_json(json_str)
|
27
|
+
|
28
|
+
class FunctionCall(BaseModel):
|
29
|
+
name: str
|
30
|
+
arguments: str
|
31
|
+
|
32
|
+
class ToolCall(BaseModel):
|
33
|
+
id: str
|
34
|
+
type: str
|
35
|
+
function: FunctionCall
|
36
|
+
|
37
|
+
class ImageUrl(BaseModel):
|
38
|
+
url: str
|
39
|
+
|
40
|
+
class ContentItem(BaseModel):
|
41
|
+
type: str
|
42
|
+
text: Optional[str] = None
|
43
|
+
image_url: Optional[ImageUrl] = None
|
44
|
+
|
45
|
+
class Message(BaseModel):
|
46
|
+
role: str
|
47
|
+
name: Optional[str] = None
|
48
|
+
arguments: Optional[str] = None
|
49
|
+
content: Optional[Union[str, List[ContentItem]]] = None
|
50
|
+
tool_calls: Optional[List[ToolCall]] = None
|
51
|
+
|
52
|
+
class Message(BaseModel):
|
53
|
+
role: str
|
54
|
+
name: Optional[str] = None
|
55
|
+
content: Optional[Union[str, List[ContentItem]]] = None
|
56
|
+
tool_calls: Optional[List[ToolCall]] = None
|
57
|
+
tool_call_id: Optional[str] = None
|
58
|
+
|
59
|
+
class Config:
|
60
|
+
extra = "allow" # 允许额外的字段
|
61
|
+
|
62
|
+
class FunctionChoice(BaseModel):
|
63
|
+
name: str
|
64
|
+
|
65
|
+
class ToolChoice(BaseModel):
|
66
|
+
type: str
|
67
|
+
function: Optional[FunctionChoice] = None
|
68
|
+
|
69
|
+
class BaseRequest(BaseModel):
|
70
|
+
request_type: Optional[Literal["chat", "image", "audio", "moderation"]] = Field(default=None, exclude=True)
|
71
|
+
|
72
|
+
import warnings
|
73
|
+
warnings.filterwarnings("ignore", category=UserWarning, message=".*shadows an attribute.*")
|
74
|
+
|
75
|
+
class JsonSchema(BaseModel):
|
76
|
+
name: str
|
77
|
+
schema: Dict[str, Any] = Field(validation_alias='schema')
|
78
|
+
|
79
|
+
model_config = ConfigDict(protected_namespaces=())
|
80
|
+
|
81
|
+
class ResponseFormat(BaseModel):
|
82
|
+
type: Literal["text", "json_object", "json_schema"]
|
83
|
+
json_schema: Optional[JsonSchema] = None
|
84
|
+
|
85
|
+
class Thinking(BaseModel):
|
86
|
+
budget_tokens: Optional[int] = None
|
87
|
+
type: Optional[Literal["enabled", "disabled"]] = None
|
88
|
+
|
89
|
+
class StreamOptions(BaseModel):
|
90
|
+
include_usage: Optional[bool] = None
|
91
|
+
|
92
|
+
class RequestModel(BaseRequest):
|
93
|
+
model: str
|
94
|
+
messages: List[Message]
|
95
|
+
logprobs: Optional[bool] = None
|
96
|
+
top_logprobs: Optional[int] = None
|
97
|
+
stream: Optional[bool] = None
|
98
|
+
include_usage: Optional[bool] = None
|
99
|
+
temperature: Optional[float] = 0.5
|
100
|
+
top_p: Optional[float] = 1.0
|
101
|
+
max_tokens: Optional[int] = None
|
102
|
+
max_completion_tokens: Optional[int] = None
|
103
|
+
presence_penalty: Optional[float] = 0.0
|
104
|
+
frequency_penalty: Optional[float] = 0.0
|
105
|
+
n: Optional[int] = 1
|
106
|
+
user: Optional[str] = None
|
107
|
+
tool_choice: Optional[Union[str, ToolChoice]] = None
|
108
|
+
tools: Optional[List[Tool]] = None
|
109
|
+
response_format: Optional[ResponseFormat] = None
|
110
|
+
thinking: Optional[Thinking] = None
|
111
|
+
stream_options: Optional[StreamOptions] = None
|
112
|
+
|
113
|
+
def get_last_text_message(self) -> Optional[str]:
|
114
|
+
for message in reversed(self.messages):
|
115
|
+
if message.content:
|
116
|
+
if isinstance(message.content, str):
|
117
|
+
return message.content
|
118
|
+
elif isinstance(message.content, list):
|
119
|
+
for item in reversed(message.content):
|
120
|
+
if item.type == "text" and item.text:
|
121
|
+
return item.text
|
122
|
+
return ""
|
123
|
+
|
124
|
+
def model_dump(self, **kwargs):
|
125
|
+
data = super().model_dump(**kwargs)
|
126
|
+
|
127
|
+
# 检查并处理 tools 字段
|
128
|
+
if 'tools' in data and data['tools']:
|
129
|
+
for tool in data['tools']:
|
130
|
+
if 'function' in tool:
|
131
|
+
function_data = tool['function']
|
132
|
+
# 如果 parameters 为空或没有 properties,则移除
|
133
|
+
if 'parameters' in function_data and (
|
134
|
+
function_data['parameters'] is None or
|
135
|
+
not function_data['parameters'].get('properties')
|
136
|
+
):
|
137
|
+
function_data.pop('parameters', None)
|
138
|
+
|
139
|
+
return data
|
140
|
+
|
141
|
+
class ImageGenerationRequest(BaseRequest):
|
142
|
+
prompt: str
|
143
|
+
model: Optional[str] = "dall-e-3"
|
144
|
+
n: Optional[int] = 1
|
145
|
+
response_format: Optional[str] = "url"
|
146
|
+
size: Optional[str] = "1024x1024"
|
147
|
+
stream: bool = False
|
148
|
+
|
149
|
+
class EmbeddingRequest(BaseRequest):
|
150
|
+
input: Union[str, List[Union[str, int, List[int]]]] # 支持字符串或数组
|
151
|
+
model: str
|
152
|
+
encoding_format: Optional[str] = "float"
|
153
|
+
dimensions: Optional[int] = None
|
154
|
+
user: Optional[str] = None
|
155
|
+
stream: bool = False
|
156
|
+
|
157
|
+
class AudioTranscriptionRequest(BaseRequest):
|
158
|
+
file: Tuple[str, IOBase, str]
|
159
|
+
model: str
|
160
|
+
language: Optional[str] = None
|
161
|
+
prompt: Optional[str] = None
|
162
|
+
response_format: Optional[str] = None
|
163
|
+
temperature: Optional[float] = None
|
164
|
+
stream: bool = False
|
165
|
+
timestamp_granularities: Optional[List[str]] = Field(default=["segment"])
|
166
|
+
|
167
|
+
class Config:
|
168
|
+
arbitrary_types_allowed = True
|
169
|
+
|
170
|
+
class ModerationRequest(BaseRequest):
|
171
|
+
input: Union[str, List[str]]
|
172
|
+
model: Optional[str] = "text-moderation-latest"
|
173
|
+
stream: bool = False
|
174
|
+
|
175
|
+
class TextToSpeechRequest(BaseRequest):
|
176
|
+
model: str
|
177
|
+
input: str
|
178
|
+
voice: str
|
179
|
+
response_format: Optional[str] = "mp3"
|
180
|
+
speed: Optional[float] = 1.0
|
181
|
+
stream: Optional[bool] = False # Add this line
|
182
|
+
|
183
|
+
class UnifiedRequest(BaseModel):
|
184
|
+
data: Union[RequestModel, ImageGenerationRequest, AudioTranscriptionRequest, ModerationRequest, EmbeddingRequest, TextToSpeechRequest]
|
185
|
+
|
186
|
+
@model_validator(mode='before')
|
187
|
+
@classmethod
|
188
|
+
def set_request_type(cls, values):
|
189
|
+
if isinstance(values, dict):
|
190
|
+
if "messages" in values:
|
191
|
+
values["data"] = RequestModel(**values)
|
192
|
+
values["data"].request_type = "chat"
|
193
|
+
elif "prompt" in values:
|
194
|
+
values["data"] = ImageGenerationRequest(**values)
|
195
|
+
values["data"].request_type = "image"
|
196
|
+
elif "file" in values:
|
197
|
+
values["data"] = AudioTranscriptionRequest(**values)
|
198
|
+
values["data"].request_type = "audio"
|
199
|
+
elif "tts" in values.get("model", ""):
|
200
|
+
values["data"] = TextToSpeechRequest(**values)
|
201
|
+
values["data"].request_type = "tts"
|
202
|
+
elif "text-embedding" in values.get("model", ""):
|
203
|
+
values["data"] = EmbeddingRequest(**values)
|
204
|
+
values["data"].request_type = "embedding"
|
205
|
+
elif "input" in values:
|
206
|
+
values["data"] = ModerationRequest(**values)
|
207
|
+
values["data"].request_type = "moderation"
|
208
|
+
else:
|
209
|
+
raise ValueError("无法确定请求类型")
|
210
|
+
return values
|
211
|
+
|
212
|
+
if __name__ == "__main__":
|
213
|
+
# 示例JSON字符串
|
214
|
+
json_str = '''
|
215
|
+
{
|
216
|
+
"type": "function",
|
217
|
+
"function": {
|
218
|
+
"name": "clock-time____getCurrentTime____standalone",
|
219
|
+
"description": "获取当前时间",
|
220
|
+
"parameters": {
|
221
|
+
"type": "object",
|
222
|
+
"properties": {}
|
223
|
+
}
|
224
|
+
}
|
225
|
+
}
|
226
|
+
'''
|
227
|
+
|
228
|
+
# 解析JSON字符串为Tool对象
|
229
|
+
tool = Tool.parse_raw(json_str)
|
230
|
+
|
231
|
+
# parameters 字段将被自动排除
|
232
|
+
print(tool.model_dump(exclude_unset=True))
|