¥
立即购买

Python API请求构建专家

0 浏览
0 试用
0 购买
Dec 10, 2025更新

本提示词专门用于生成基于Python requests库的API请求代码,能够根据用户提供的API端点、请求方法、参数等信息,自动构建完整且规范的HTTP请求代码。该提示词支持多种HTTP方法、参数类型和认证方式,适用于RESTful API开发、接口测试、数据获取等多种场景,帮助开发者快速生成可靠的技术实现方案。

代码实现

import os
import json
from typing import Any, Dict, List, Optional
import requests
from requests import Response, Session
from requests.adapters import HTTPAdapter
from urllib3.util import Retry


TEXTCRAFT_API_URL = "https://api.textcraft.example.com/v1/text/generate"
ENV_TOKEN_VAR = "TEXTCRAFT_API_TOKEN"


def _build_session(
    total_retries: int = 3,
    backoff_factor: float = 0.5,
    status_forcelist: Optional[List[int]] = None,
) -> Session:
    """
    创建带重试策略的 requests Session。
    """
    if status_forcelist is None:
        status_forcelist = [429, 500, 502, 503, 504]

    retry = Retry(
        total=total_retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        allowed_methods=frozenset(["POST"]),
        raise_on_status=False,
        respect_retry_after_header=True,
    )

    adapter = HTTPAdapter(max_retries=retry)
    session = requests.Session()
    session.mount("https://", adapter)
    session.mount("http://", adapter)
    return session


def generate_text(
    prompt: str,
    model: str = "tc-1.2-instruct",
    *,
    max_tokens: int = 380,
    temperature: float = 0.7,
    top_p: float = 0.9,
    stop: Optional[List[str]] = None,
    api_url: str = TEXTCRAFT_API_URL,
    token: Optional[str] = None,
    timeout: float = 15.0,
    header_name: str = "Authorization",
    prefix: str = "Bearer",
    session: Optional[Session] = None,
) -> Dict[str, Any]:
    """
    调用 TextCraft 文本生成 API。

    参数:
        prompt: 生成文本的提示词。
        model: 模型名称。
        max_tokens: 最多生成 token 数。
        temperature: 随机性参数,范围建议 [0, 1]。
        top_p: nucleus sampling 参数,范围建议 [0, 1]。
        stop: 停止序列列表,模型生成到任一序列时会停止。
        api_url: API 端点。
        token: 访问令牌;若为 None,则从环境变量 TEXTCRAFT_API_TOKEN 读取。
        timeout: 单次请求超时时间(秒)。
        header_name: 认证头字段名(默认 Authorization)。
        prefix: 认证前缀(默认 Bearer)。
        session: 可选自定义 requests.Session。
    返回:
        解析后的 JSON 字典。
    """
    # 安全获取 Token(不在代码中硬编码)
    api_token = token or os.getenv(ENV_TOKEN_VAR)
    if not api_token:
        raise ValueError(
            f"Missing API token. Provide `token` or set environment variable {ENV_TOKEN_VAR}."
        )

    # 基本入参校验(避免发送无效请求)
    if not isinstance(prompt, str) or not prompt.strip():
        raise ValueError("`prompt` must be a non-empty string.")
    if max_tokens <= 0:
        raise ValueError("`max_tokens` must be a positive integer.")
    if not (0.0 <= temperature <= 2.0):
        raise ValueError("`temperature` should be within [0.0, 2.0].")
    if not (0.0 <= top_p <= 1.0):
        raise ValueError("`top_p` should be within [0.0, 1.0].")
    if stop is not None and not all(isinstance(s, str) for s in stop):
        raise ValueError("`stop` must be a list of strings when provided.")

    headers = {
        header_name: f"{prefix} {api_token}",
        "Content-Type": "application/json",
        "Accept": "application/json",
        "User-Agent": "textcraft-requests-client/1.0 (+https://example.com)",
    }

    payload: Dict[str, Any] = {
        "model": model,
        "prompt": prompt,
        "max_tokens": max_tokens,
        "temperature": temperature,
        "top_p": top_p,
    }
    if stop is not None:
        payload["stop"] = stop

    sess = session or _build_session()

    try:
        resp: Response = sess.post(
            api_url,
            headers=headers,
            json=payload,
            timeout=timeout,
        )
    except requests.exceptions.Timeout as exc:
        raise TimeoutError(f"Request timed out after {timeout} seconds.") from exc
    except requests.exceptions.RequestException as exc:
        # 覆盖网络类错误,如连接异常、证书问题等
        raise ConnectionError(f"Network error occurred: {exc}") from exc

    # 状态码检查与错误信息尽量友好
    if not (200 <= resp.status_code < 300):
        # 尝试解析服务端错误详情
        err_detail = None
        try:
            err_detail = resp.json()
        except Exception:
            err_detail = resp.text[:1000]  # 截断,避免过长
        raise RuntimeError(
            f"API request failed with status {resp.status_code}. Details: {err_detail}"
        )

    try:
        data = resp.json()
    except json.JSONDecodeError as exc:
        snippet = resp.text[:1000]
        raise ValueError(f"Failed to parse JSON response. Body snippet: {snippet}") from exc

    return data


if __name__ == "__main__":
    # 示例演示:从环境变量读取 Token 并发起请求
    demo_prompt = (
        "请根据以下变更日志,生成一份面向用户的中文发布说明(包含亮点、问题修复、升级建议、兼容性说明)。\n\n"
        "变更日志:\n"
        "- 新增“跨设备同步”功能,支持手机与平板实时同步日程;\n"
        "- 优化搜索性能,平均响应时间从320ms降至110ms;\n"
        "- 修复重复提醒偶发问题(Issue#4721);\n"
        "- 默认主题新增“雾蓝”;\n"
        "- iOS 13 以下不再提供更新。\n\n"
        "语气:专业但友好;\n"
        "格式:分级标题+项目符号;\n"
        "长度:200-300字;\n"
        "避免:营销式夸张用语。"
    )

    try:
        result = generate_text(
            prompt=demo_prompt,
            model="tc-1.2-instruct",
            max_tokens=380,
            temperature=0.7,
            top_p=0.9,
            stop=["```"],
        )
        print(json.dumps(result, ensure_ascii=False, indent=2))
    except Exception as e:
        # 生产环境可改为日志记录,但避免输出敏感信息(如 Token)
        print(f"Error: {e}")

参数说明

  • prompt: 必填。用于指导模型生成内容的提示文本。
  • model: 选填。模型名称,默认 tc-1.2-instruct。
  • max_tokens: 选填。限制生成内容的最大 token 数,默认 380。
  • temperature: 选填。控制生成的多样性,数值越大越随机,默认 0.7。
  • top_p: 选填。核采样阈值,默认 0.9。
  • stop: 选填。停止序列列表,例如 ["```"],当生成命中任一序列即停止。
  • api_url: 选填。API 端点地址,默认 https://api.textcraft.example.com/v1/text/generate。
  • token: 选填。API 访问令牌;不传时从环境变量 TEXTCRAFT_API_TOKEN 读取。
  • timeout: 选填。请求超时(秒),默认 15。
  • header_name: 选填。认证头字段名,默认 Authorization。
  • prefix: 选填。认证前缀,默认 Bearer。
  • session: 选填。自定义 requests.Session;不传则使用内置带重试的 Session。

使用示例

  • 设置环境变量方式(推荐):
    • Linux/macOS: export TEXTCRAFT_API_TOKEN="你的令牌"
    • Windows (PowerShell): setx TEXTCRAFT_API_TOKEN "你的令牌"
  • 代码调用:
from your_module import generate_text

prompt = (
    "请根据以下变更日志,生成一份面向用户的中文发布说明(包含亮点、问题修复、升级建议、兼容性说明)。\n\n"
    "变更日志:\n"
    "- 新增“跨设备同步”功能,支持手机与平板实时同步日程;\n"
    "- 优化搜索性能,平均响应时间从320ms降至110ms;\n"
    "- 修复重复提醒偶发问题(Issue#4721);\n"
    "- 默认主题新增“雾蓝”;\n"
    "- iOS 13 以下不再提供更新。\n\n"
    "语气:专业但友好;\n"
    "格式:分级标题+项目符号;\n"
    "长度:200-300字;\n"
    "避免:营销式夸张用语。"
)

result = generate_text(
    prompt=prompt,
    model="tc-1.2-instruct",
    max_tokens=380,
    temperature=0.7,
    top_p=0.9,
    stop=["```"],  # 可选
)

# 打印或处理返回 JSON
import json
print(json.dumps(result, ensure_ascii=False, indent=2))
  • 以参数传入令牌(不推荐硬编码,示例仅为说明):
result = generate_text(
    prompt=prompt,
    token=os.getenv("TEXTCRAFT_API_TOKEN"),  # 或从安全存储读取
)

注意事项

  • 不要在代码中硬编码真实令牌。通过环境变量或安全密钥管理服务注入。
  • 避免在日志中输出认证头和令牌。示例中仅输出错误摘要。
  • 根据实际网络和服务端吞吐调整 timeout 与重试策略(total_retries、backoff_factor)。
  • stop 序列是可选的,包含特殊字符(如反引号)无需转义,按原样传入列表即可。
  • 如果服务端返回 4xx/5xx,代码会抛出异常并尽量给出服务端错误详情;可在生产中改为结构化日志记录。
  • requests 默认启用 TLS 证书校验,请勿关闭 verify 以确保传输安全。
  • 代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TextCraft Chat API 调用示例(requests + Basic Auth + 流式响应处理)

特性
- 使用 requests.Session 复用连接
- Basic 认证从环境变量读取,避免硬编码敏感信息
- 支持流式(text/event-stream)与非流式(application/json)两种返回
- 健壮的错误处理与超时设置
- 轻量的SSE解析器,能兼容常见的 data: 行式分片
"""

import os
import sys
import json
import contextlib
from typing import Generator, Iterable, Optional, Union, Dict, Any
import requests
from requests.auth import HTTPBasicAuth
from requests.exceptions import RequestException, Timeout, HTTPError, ConnectionError


DEFAULT_BASE_URL = "https://api.textcraft.example.com"
DEFAULT_TIMEOUT = (10, 300)  # (connect_timeout, read_timeout)


class TextCraftClient:
    """
    TextCraft API 客户端(Basic Auth)
    """
    def __init__(
        self,
        base_url: str = DEFAULT_BASE_URL,
        username: Optional[str] = None,
        password: Optional[str] = None,
        timeout: Union[float, tuple] = DEFAULT_TIMEOUT,
        verify: Union[bool, str] = True,
        session: Optional[requests.Session] = None,
    ) -> None:
        """
        参数:
        - base_url: API服务基础URL, 如 https://api.textcraft.example.com
        - username: 基本认证用户名(建议从环境变量读取)
        - password: 基本认证密码(建议从环境变量读取)
        - timeout: 超时设置,float或(connect, read)元组
        - verify: TLS证书校验,为True或CA证书路径
        - session: 可注入自定义requests.Session
        """
        self.base_url = base_url.rstrip("/")
        self.timeout = timeout
        self.verify = verify
        self.session = session or requests.Session()

        # 从环境变量兜底读取凭证,避免硬编码敏感信息
        self.username = username or os.getenv("TEXTCRAFT_USERNAME")
        self.password = password or os.getenv("TEXTCRAFT_PASSWORD")
        if not self.username or not self.password:
            raise ValueError(
                "缺少Basic认证凭证。请通过参数或环境变量 "
                "TEXTCRAFT_USERNAME / TEXTCRAFT_PASSWORD 提供。"
            )

        self.auth = HTTPBasicAuth(self.username, self.password)
        self.default_headers = {
            "User-Agent": "textcraft-python/1.0",
        }

    def _endpoint(self, path: str) -> str:
        return f"{self.base_url.rstrip('/')}/{path.lstrip('/')}"

    @staticmethod
    def _extract_stream_piece(obj: Dict[str, Any]) -> Optional[str]:
        """
        尝试从常见的SSE JSON数据结构中提取文本片段。
        若结构未知,返回None让上层以原始字符串回退。
        兼容多种常见字段命名。
        """
        # 常见结构1:choices[].delta.content(OpenAI风格)
        try:
            return obj["choices"][0]["delta"].get("content")
        except Exception:
            pass

        # 常见结构2:choices[].message.content(最终消息)
        try:
            return obj["choices"][0]["message"].get("content")
        except Exception:
            pass

        # 常见结构3:直接 content 字段
        try:
            if isinstance(obj.get("content"), str):
                return obj["content"]
        except Exception:
            pass

        return None

    @staticmethod
    def _iter_sse_lines(resp: requests.Response) -> Iterable[str]:
        """
        简单SSE解析:只处理 data: 行;忽略注释和空行。
        以行作为边界,不做多行拼接;适合多数token级别增量场景。
        """
        for raw in resp.iter_lines(decode_unicode=True):
            if not raw:
                continue
            if raw.startswith(":"):
                # SSE注释行
                continue
            if raw.startswith("data:"):
                data = raw[5:].strip()
                # 约定的结束信号
                if data == "[DONE]":
                    return
                yield data

    def chat(
        self,
        messages: Iterable[Dict[str, str]],
        model: str = "tc-1.2-chat",
        temperature: float = 0.3,
        stream: bool = True,
        max_tokens: int = 600,
        extra_headers: Optional[Dict[str, str]] = None,
    ) -> Union[Dict[str, Any], Generator[str, None, None]]:
        """
        发起聊天请求。
        - 若 stream=True,返回一个生成器,逐段产出文本片段(str)。
        - 若 stream=False,返回一次性JSON结果(dict)。

        注意:使用完毕后生成器会自动关闭底层响应,确保资源释放。
        """
        url = self._endpoint("/v1/chat")
        payload = {
            "model": model,
            "messages": list(messages),
            "temperature": float(temperature),
            "stream": bool(stream),
            "max_tokens": int(max_tokens),
        }

        headers = dict(self.default_headers)
        # 根据是否流式设置Accept
        if stream:
            headers["Accept"] = "text/event-stream, application/json;q=0.9"
        else:
            headers["Accept"] = "application/json"
        headers["Content-Type"] = "application/json"
        if extra_headers:
            headers.update(extra_headers)

        try:
            if stream:
                resp = self.session.post(
                    url,
                    headers=headers,
                    json=payload,
                    auth=self.auth,
                    timeout=self.timeout,
                    verify=self.verify,
                    stream=True,
                )
                resp.raise_for_status()

                ctype = (resp.headers.get("Content-Type") or "").lower()
                is_sse = "text/event-stream" in ctype

                @contextlib.contextmanager
                def _closer(r: requests.Response):
                    try:
                        yield
                    finally:
                        # 确保连接回收
                        r.close()

                def _generator() -> Generator[str, None, None]:
                    with _closer(resp):
                        if is_sse:
                            for data in self._iter_sse_lines(resp):
                                # 优先尝试解析JSON提取文本片段
                                piece = None
                                if data and (data.startswith("{") or data.startswith("[")):
                                    try:
                                        obj = json.loads(data)
                                        piece = self._extract_stream_piece(obj)
                                        # 若无法提取但是JSON,回退为紧凑字符串输出
                                        if piece is None:
                                            piece = json.dumps(obj, ensure_ascii=False)
                                    except json.JSONDecodeError:
                                        # 非JSON片段,按原始字符串返回
                                        piece = data
                                else:
                                    piece = data
                                if piece:
                                    yield piece
                        else:
                            # 一些服务即使指定了stream也返回完整JSON
                            chunk = resp.content.decode(resp.encoding or "utf-8", errors="replace")
                            try:
                                obj = json.loads(chunk)
                                # 直接输出完整消息体(非流模式的兼容分支)
                                text = self._extract_stream_piece(obj) or json.dumps(obj, ensure_ascii=False)
                                yield text
                            except json.JSONDecodeError:
                                # 回退为原始文本
                                yield chunk

                return _generator()

            else:
                resp = self.session.post(
                    url,
                    headers=headers,
                    json=payload,
                    auth=self.auth,
                    timeout=self.timeout,
                    verify=self.verify,
                )
                resp.raise_for_status()
                return resp.json()

        except HTTPError as e:
            # 服务端返回非2xx
            detail = None
            if e.response is not None:
                try:
                    detail = e.response.json()
                except Exception:
                    detail = e.response.text
            raise RuntimeError(f"HTTP错误: {e} | 详情: {detail}") from e
        except Timeout as e:
            raise TimeoutError(f"请求超时: {e}") from e
        except ConnectionError as e:
            raise ConnectionError(f"连接失败: {e}") from e
        except RequestException as e:
            raise RuntimeError(f"请求异常: {e}") from e


def main() -> None:
    """
    可执行示例:以流式打印返回内容到标准输出。
    """
    # 示例消息(来自问题描述)
    messages = [
        {
            "role": "system",
            "content": "你是一名资深中文写作助手,擅长将多段素材整合为结构清晰的文章。输出使用中文,格式为标题、导语、正文小节、结尾。"
        },
        {
            "role": "user",
            "content": "素材1:本周我们上线了“离线草稿”与“自动保存”功能,解决了弱网环境内容丢失问题;素材2:新增草稿历史版本对比,并提供一键恢复;读者对象:写作爱好者与自媒体作者;风格:实用、清晰、适度幽默;长度:约600字。"
        },
    ]

    client = TextCraftClient(
        base_url="https://api.textcraft.example.com",
        # 为安全起见,用户名/密码请通过环境变量 TEXTCRAFT_USERNAME / TEXTCRAFT_PASSWORD 提供
        # username=os.getenv("TEXTCRAFT_USERNAME"),
        # password=os.getenv("TEXTCRAFT_PASSWORD"),
        timeout=(10, 300),
        verify=True,
    )

    # 流式打印
    try:
        stream = client.chat(
            messages=messages,
            model="tc-1.2-chat",
            temperature=0.3,
            stream=True,
            max_tokens=600,
        )
        if isinstance(stream, dict):
            # 极少数情况下服务端可能返回非流式JSON(即使指定了stream=True)
            sys.stdout.write(json.dumps(stream, ensure_ascii=False))
            sys.stdout.flush()
        else:
            for piece in stream:
                sys.stdout.write(piece)
                sys.stdout.flush()
    except Exception as e:
        # 统一错误输出
        print(f"\n调用失败: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()
  • 参数说明:

    • base_url:API基础地址。默认 https://api.textcraft.example.com。
    • username/password:Basic认证用户名与密码。为安全起见请通过环境变量 TEXTCRAFT_USERNAME、TEXTCRAFT_PASSWORD 提供,避免硬编码。
    • timeout:请求超时。可为单个浮点数或(connect_timeout, read_timeout)元组。示例中为(10, 300),以支持较长流式会话。
    • verify:TLS证书校验。True 为启用系统CA;也可传入自定义CA文件路径。不要关闭校验除非在受控环境下。
    • messages:对话消息数组,每个元素包含 role 和 content。role 常见取值:system、user、assistant。
    • model:模型名称,示例为 tc-1.2-chat。
    • temperature:采样温度,0.0-1.0。
    • stream:是否开启流式返回。True 时将返回生成器,逐段产出内容;False 时返回一次性JSON。
    • max_tokens:生成上限token数。
    • extra_headers:可选的自定义请求头(如业务追踪ID)。
  • 使用示例:

# 1) 设置环境变量(Linux/macOS)
export TEXTCRAFT_USERNAME="test_analyst"
export TEXTCRAFT_PASSWORD="s3curePwd!42"

# Windows (PowerShell)
# $env:TEXTCRAFT_USERNAME="test_analyst"
# $env:TEXTCRAFT_PASSWORD="s3curePwd!42"

# 2) 运行脚本
python textcraft_client.py

或在代码中以库方式调用(非流式一次性结果示例):

from textcraft_client import TextCraftClient

client = TextCraftClient()
resp = client.chat(
    messages=[{"role":"user","content":"请用一句话介绍你自己"}],
    model="tc-1.2-chat",
    stream=False,
    max_tokens=100
)
print(resp)
  • 注意事项:
    • 凭证安全:不要将用户名/密码硬编码进代码或提交到版本控制。请使用环境变量或安全的密钥管理方案。
    • 超时与健壮性:流式响应可能较长,读超时(read timeout)请适当放宽;连接超时(connect timeout)保持较短以快速失败。
    • 流式协议兼容:代码优先按 text/event-stream 解析SSE;若服务端返回application/json(即使请求了流式),也能兼容处理。
    • 错误处理:已对HTTP错误、超时、连接错误等进行分类处理,并包含服务端错误体的安全输出。生产环境可对异常信息做更细粒度日志与观测。
    • TLS 校验:保持 verify=True,除非在测试环境且已知信任的自签证书;禁用校验存在中间人攻击风险。
    • 重试策略:示例未对POST做自动重试,以避免重复请求带来的副作用或计费。若确需重试,请在调用层根据幂等性和业务容忍度谨慎实现。
    • 日志脱敏:在记录请求/响应日志时避免输出Authorization、密码以及完整响应内容(尤其包含用户隐私数据时)。

示例详情

解决的问题

以更少时间、更少试错,快速拿到可运行、可复用的Python接口请求代码。通过自然语言描述接口地址、请求方式、关键参数与认证方式,即可一键生成包含:完整代码、参数说明、调用示例与注意事项的“交付四件套”。核心价值:标准化团队写法、内置安全与错误处理、覆盖多种请求场景,帮助开发、测试与数据同学从联调到上线全流程提速,显著提升交付质量与稳定性。

适用用户

后端开发工程师

快速生成可运行的调用代码,打通测试与线上环境,覆盖常见请求场景并加入错误处理,减少联调与排障时间。

数据工程师/分析师

构建稳定的数据采集脚本,灵活设置筛选与分页参数,可靠抓取外部数据写入数据源,失败可重试并记录原因。

测试工程师

面向接口测试快速产出用例脚本,覆盖正常与异常路径,批量执行回归测试,缩短用例维护与复用成本。

特征总结

根据端点与方法,一键生成可运行的Python网络请求代码,告别从零搭建与反复试错。
支持查询参数、表单与文件上传,自动拼装请求数据,避免格式错误与遗漏细节。
内置多种身份验证方案,智能注入令牌与密钥占位,保护敏感信息不落盘。
自动添加状态检查与异常处理,清晰提示错误原因,便于快速定位与重试。
同步输出参数说明与使用示例,照着即用,团队成员也能迅速接手与复用。
可按项目风格定制通用头信息与参数,沉淀为模板,跨项目复用不返工。
适配服务集成、接口联调与数据抓取场景,从验证到上线显著缩短交付周期。
遵循安全与规范约束,避免硬编码凭据与不安全写法,降低合规与安全风险。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 562 tokens
- 4 个可调节参数
{ API端点 } { 请求方法 } { 请求参数 } { 认证信息 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59