1、基本模型

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    age: int
    email: str

# 自动类型转换
user = User(id="1", name="Alice", age="25", email="alice@example.com")
print(user)
# id=1 name='Alice' age=25 email='alice@example.com'

print(user.id, type(user.id))  # 1 <class 'int'>

2、字段校验与默认值

from pydantic import BaseModel, Field
from typing import Optional

class Product(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    price: float = Field(..., gt=0, description="价格必须大于0")
    quantity: int = Field(default=0, ge=0)
    description: Optional[str] = None

p = Product(name="苹果", price=5.5)
print(p)
# name='苹果' price=5.5 quantity=0 description=None

# 校验失败会抛出 ValidationError
try:
    Product(name="", price=-1)
except Exception as e:
    print(e)

3、嵌套模型

from pydantic import BaseModel
from typing import List

class Address(BaseModel):
    city: str
    street: str

class Person(BaseModel):
    name: str
    age: int
    addresses: List[Address]

data = {
    "name": "Bob",
    "age": 30,
    "addresses": [
        {"city": "北京", "street": "长安街"},
        {"city": "上海", "street": "南京路"},
    ]
}

person = Person(**data)
print(person.addresses[0].city)  # 北京
print(person.model_dump())       # 转 dict
print(person.model_dump_json())  # 转 JSON 字符串

4、自定义校验器

from pydantic import BaseModel, field_validator, model_validator

class User(BaseModel):
    username: str
    password: str
    confirm_password: str

    @field_validator("username")
    @classmethod
    def username_alphanumeric(cls, v: str) -> str:
        if not v.isalnum():
            raise ValueError("用户名必须为字母或数字")
        return v.lower()

    @model_validator(mode="after")
    def check_passwords_match(self):
        if self.password != self.confirm_password:
            raise ValueError("两次密码不一致")
        return self

u = User(username="Alice123", password="abc", confirm_password="abc")
print(u.username)  # alice123

5、枚举与leteral

from pydantic import BaseModel
from enum import Enum
from typing import Literal

class Status(str, Enum):
    active = "active"
    inactive = "inactive"

class Account(BaseModel):
    status: Status
    role: Literal["admin", "user", "guest"]

a = Account(status="active", role="admin")
print(a.status)  # Status.active

6、环境变量配置(baseSettings)

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    app_name: str = "MyApp"
    debug: bool = False
    database_url: str

    model_config = {
        "env_file": ".env",
        "env_prefix": "APP_",
    }

# .env 文件内容:
# APP_DATABASE_URL=postgresql://localhost/db
# APP_DEBUG=true

settings = Settings()
print(settings.database_url)

7、序列化与模型转换

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    password: str

u = User(id=1, name="Alice", password="secret")

# 导出时排除敏感字段
print(u.model_dump(exclude={"password"}))
# {'id': 1, 'name': 'Alice'}

# 从 ORM 对象创建(需开启 from_attributes)
class UserORM:
    def __init__(self, id, name, password):
        self.id = id
        self.name = name
        self.password = password

class UserSchema(BaseModel):
    id: int
    name: str
    model_config = {"from_attributes": True}

orm_user = UserORM(1, "Bob", "xxx")
print(UserSchema.model_validate(orm_user))

8、泛型模型

from pydantic import BaseModel
from typing import Generic, TypeVar

T = TypeVar("T")

class Response(BaseModel, Generic[T]):
    code: int
    message: str
    data: T

class UserInfo(BaseModel):
    id: int
    name: str

resp = Response[UserInfo](
    code=200,
    message="ok",
    data={"id": 1, "name": "Alice"}
)
print(resp.data.name)  # Alice





1、jwt(官方文档)
安装: pip install pyjwt[crypto]
基本使用:

import jwt
key = "secret"
encoded = jwt.encode({"some": "payload"}, key, algorithm="HS256")
jwt.decode(encoded, key, algorithms="HS256")
{'some': 'payload'}

2、密码加密
安装: pip install "pwdlib[argon2]"
基本使用:

from pwdlib import PasswordHash
password = "123456"
password_hash = PasswordHash.recommended()
hash = password_hash.hash(password)
isPass = password_hash.verify(password, hash)  # True

根据以下文章进行解析,先进行分句,再逐句分析句型结构、常用短语、翻译、以及疑难单词。
###
{文章内容}
###

# 解析要求
- 显示每一句的原文和对应的中文翻译
- 显示每一句的句型结构,以及详细说明,如果是定语,需要说明修饰哪个先行词。
- 显示每一句的日常交流中频繁使用的固定表达, 显示对应含义
- 显示每一句的疑难单词,显示对应美式音标、单词解析、对应文中的释义

# 输出
- 不需要返回原文全文
- 解析内容按markdown文件格式返回,以```markdown开头,```结尾


环境安装:
php的swoole4.8扩展、imagick软件(已安装)、php的imagick扩展(已安装)、

设置php.ini:
grpc.enable_fork_support = 1
swoole.use_shortname = off

系统字库:
cjk 中日韩英文
yum -y install google-noto-sans-thai-fonts google-noto-sans-lao-fonts google-noto-sans-khmer-fonts google-noto-sans-myanmar-fonts

php依赖库:
composer require intervention/image

样例代码:

public function svgToImg(string $svgPath, string $meetId = '000', string $outputPath = null, string $format = 'png', int $resolution = 2048)
    {
        try {
            // 优先使用 Imagick 驱动(最稳定支持 SVG)
            $manager = new ImageManager([
                'driver' => 'imagick'
            ]);

            $svgContent = file_get_contents($svgPath);
            
            $image = $manager->make($svgContent);
            
            // 处理分辨率参数(默认 2k = 2048px)
            if ($resolution !== 2048) {
                $image->resize($resolution, $resolution, function ($constraint) {
                    $constraint->aspectRatio();
                });
            }
            
            $fileName = "summary_{$meetId}_" . Str::get_random_code(5);
            // 处理默认输出路径
            if (empty($outputPath)) {
                $ext        = (in_array(strtolower($format), ['jpeg', 'jpg'])) ? 'jpg' : 'png';
                $outputPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName . '.' . $ext;
            }
            
            // 确保输出目录存在
            $outputDir = dirname($outputPath);
            if (!file_exists($outputDir)) {
                mkdir($outputDir, 0755, true);
            }
            
            // 保存图片
            if (in_array(strtolower($format), ['jpeg', 'jpg'])) {
                $image->save($outputPath, 90);
            } else {
                $image->save($outputPath);
            }
            
            // 返回图片路径
            $imagePath = realpath($outputPath);
            if (!file_exists($imagePath)) {
                throw new \Exception('svgToImageV2===图片文件不存在==' . $outputPath);
            }
        
            return $imagePath;
        } catch (\Exception $e) {
            throw new \Exception("svgToImageV2===转换失败: " . $e->getMessage());
        }
    }











1、安装(官方文档):
pip install -U "langgraph-cli[inmem]"

2、创建项目骨架(交互式):
langgraph new path/to/your/app

3、安装项目依赖:
cd path/to/your/app
pip install -e .

4、配置.env文件:

# To separate your traces from other application
LANGSMITH_PROJECT=new-agent

# Add API keys for connecting to LLM providers, data sources, and other integrations here
# 要去langsmith搞个账号获取api秘钥
LANGSMITH_API_KEY=xxxxx

5、运行:
langgraph dev

注意事项:
windows环境下powershell,运行前设置

$env:PYTHONIOENCODING="utf-8"
$env:PYTHONUTF8="1"