Metadata-Version: 2.4
Name: descartcan
Version: 2025.11.13.4
Summary: A Python toolkit for advanced data processing and API interactions
Home-page: 
Author: DescartCan
Author-email: louishwh@gmail.com
Project-URL: Bug Tracker, https://github.com/DescartCan/python_kit/issues
Project-URL: Documentation, https://doc.descart.com/
Project-URL: Source Code, https://github.com/DescartCan/python_kit
Keywords: api,toolkit
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: loguru==0.6.0
Requires-Dist: pyyaml~=6.0.2
Requires-Dist: aiohttp>=3.11.10
Requires-Dist: aiofiles~=24.1.0
Provides-Extra: service
Requires-Dist: uvloop~=0.21.0; extra == "service"
Requires-Dist: pytz==2025.2; extra == "service"
Requires-Dist: psutil==7.0.0; extra == "service"
Requires-Dist: aiohttp>=3.12.13; extra == "service"
Requires-Dist: httpx==0.25.2; extra == "service"
Requires-Dist: aiofiles~=24.1.0; extra == "service"
Requires-Dist: python-dotenv==0.21.1; extra == "service"
Requires-Dist: pydantic==2.11.7; extra == "service"
Requires-Dist: PyJWT==2.10.1; extra == "service"
Requires-Dist: redis==6.2.0; extra == "service"
Requires-Dist: tortoise-orm==0.19.0; extra == "service"
Requires-Dist: aiomysql==0.2.0; extra == "service"
Requires-Dist: fastapi==0.115.13; extra == "service"
Requires-Dist: uvicorn[standard]==0.29.0; extra == "service"
Requires-Dist: gunicorn==23.0.0; extra == "service"
Requires-Dist: cryptography==45.0.4; extra == "service"
Requires-Dist: pymilvus==2.4.2; extra == "service"
Requires-Dist: marshmallow==3.13.0; extra == "service"
Requires-Dist: qdrant-client==1.14.3; extra == "service"
Requires-Dist: grpcio==1.60.0; extra == "service"
Requires-Dist: grpcio-tools==1.60.0; extra == "service"
Requires-Dist: protobuf==4.21.6; extra == "service"
Requires-Dist: aiokafka==0.12.0; extra == "service"
Requires-Dist: nats-py==2.10.0; extra == "service"
Provides-Extra: llm
Requires-Dist: boto3~=1.34.79; extra == "llm"
Requires-Dist: openai~=1.90.0; extra == "llm"
Requires-Dist: anthropic~=0.42.0; extra == "llm"
Requires-Dist: tiktoken==0.8.0; extra == "llm"
Requires-Dist: litellm==1.75.0; extra == "llm"
Provides-Extra: all
Requires-Dist: uvloop~=0.21.0; extra == "all"
Requires-Dist: pytz==2025.2; extra == "all"
Requires-Dist: psutil==7.0.0; extra == "all"
Requires-Dist: aiohttp>=3.12.13; extra == "all"
Requires-Dist: httpx==0.25.2; extra == "all"
Requires-Dist: aiofiles~=24.1.0; extra == "all"
Requires-Dist: python-dotenv==0.21.1; extra == "all"
Requires-Dist: pydantic==2.11.7; extra == "all"
Requires-Dist: PyJWT==2.10.1; extra == "all"
Requires-Dist: redis==6.2.0; extra == "all"
Requires-Dist: tortoise-orm==0.19.0; extra == "all"
Requires-Dist: aiomysql==0.2.0; extra == "all"
Requires-Dist: fastapi==0.115.13; extra == "all"
Requires-Dist: uvicorn[standard]==0.29.0; extra == "all"
Requires-Dist: gunicorn==23.0.0; extra == "all"
Requires-Dist: cryptography==45.0.4; extra == "all"
Requires-Dist: pymilvus==2.4.2; extra == "all"
Requires-Dist: marshmallow==3.13.0; extra == "all"
Requires-Dist: qdrant-client==1.14.3; extra == "all"
Requires-Dist: grpcio==1.60.0; extra == "all"
Requires-Dist: grpcio-tools==1.60.0; extra == "all"
Requires-Dist: protobuf==4.21.6; extra == "all"
Requires-Dist: aiokafka==0.12.0; extra == "all"
Requires-Dist: nats-py==2.10.0; extra == "all"
Requires-Dist: boto3~=1.34.79; extra == "all"
Requires-Dist: openai~=1.90.0; extra == "all"
Requires-Dist: anthropic~=0.42.0; extra == "all"
Requires-Dist: tiktoken==0.8.0; extra == "all"
Requires-Dist: litellm==1.75.0; extra == "all"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: keywords
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary


# descartcan

### LLM

#### Step1

llm_config.yaml

```yaml
openai:
  keys:
    - name: "openai_key1"
      api_key: "XXX"
  models:
    gpt4: "gpt-4-0125-preview"
    gpt40: "gpt-4o"

bedrock:
  keys:
    - name: "bedrock"
      api_key: "XXX"
      api_secret: "XXXXX"
  models:
      haiku35: "us.anthropic.claude-3-5-haiku-20241022-v1:0"

```

#### Step2 

load models

```python
from descartcan.llm.factory import LLModelFactory
model_factory = LLModelFactory.from_config(config="llm_config.yaml")
model = model_factory.get_model("openai.gpt4")

# 单轮对话
response = await model.chat(
    question="Show Python",
    system="你是一个编程专家"
)
print(f"回复: {response.content}")
print(f"Token统计: 提示词{response.prompt_tokens}, 生成{response.completion_tokens}, 总计{response.total_tokens}")

# 多轮对话
history = [
    {"role": "user", "content": "Python和Java的区别是什么？"},
    {"role": "assistant", "content": "Python和Java有以下主要区别：..."}
]

response = await model.chat(
    question="哪个更适合初学者？",
    system="你是一个编程专家",
    history=history
)
print(f"多轮对话回复: {response.content}")
```
