Документация ciyuan_market
Быстрый старт
ciyuan_market предоставляет продакшен-командам единый стабильный API для доступа к моделям, маршрутизации, резерва, отслеживания использования и биллинга на основе кредитов. Поставка LLM-токенов осуществляется через доверенные корпоративные облачные аккаунты оригинальных провайдеров, с защитой конфиденциальности, высокой стабильностью и отслеживаемостью запросов, встроенными в шлюз.
https://api.ciyuan-market.com/apihttps://api.ciyuan-market.com/api/v1https://api.ciyuan-market.com/api/v1Authorization: Bearer <key>Создание ключа API
Создайте ключ API ciyuan_market в консоли. Храните ключ на сервере и никогда не раскрывайте его в коде браузера или мобильного клиента.
Рекомендуемая стратегия ключей:
| Тип ключа | Рекомендуемое использование |
|---|---|
| Ключ для разработки | Локальная разработка, staging, тестирование и прототипы. |
| Продакшен-ключ | Только для бэкенд-нагрузок в продакшене. |
| Ключ интеграции | Отдельный ключ для таких инструментов, как Cursor, Claude Code, Codex, Hermes или OpenClaw. |
| Клиентский / тенантный ключ | Опциональная изоляция ключей для корпоративных клиентов, трафика тенантов или бизнес-подразделений. |
Ротируйте ключи при изменении доступа команды. Отзывайте ключи, которые больше не используются.
Настройте SDK на ciyuan_market
Большинству OpenAI-совместимых клиентов нужен только новый базовый URL и ключ API.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CIYUAN_MARKET_API_KEY,
baseURL: "https://api.ciyuan-market.com/api/v1"
});
Отправка chat completion
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/chat/completions \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-5",
"messages": [
{ "role": "user", "content": "Explain ciyuan_market in one sentence." }
]
}'
Проверка использования и баланса
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/billing/balance \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Обзор моделей
Используйте страницу «Модели» или API моделей для просмотра доступных текстовых моделей. Метаданные модели включают производителя, обслуживающего провайдера, модальность, длину контекста, поддерживаемые семейства API, поддерживаемые возможности, доступность, ограничения на уровне аккаунта и цены в кредитах.
Конечная точка: GET /v1/models
Назначение: Список моделей, доступных текущему аккаунту.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/models \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Матрица возможностей
| Возможность | Описание | Кто обычно использует |
|---|---|---|
streaming | Поддерживает потоковую передачу через server-sent events. | Чат-приложения, кодинг-агенты, интерактивный UX. |
tool_calling | Поддерживает вызов инструментов или функций. | Агенты, автоматизация рабочих процессов, помощники в кодинге. |
structured_outputs | Поддерживает вывод, ограниченный схемой, или JSON. | Извлечение данных, автоматизация рабочих процессов, корпоративные приложения. |
json_mode | Может возвращать вывод в формате JSON. | Лёгкие структурированные ответы. |
vision | Принимает изображения на вход. | Мультимодальный чат, анализ UI, скриншоты документов. |
prompt_caching | Поддерживает кэширование входных данных или повторное использование контекста. | Агенты с длинным контекстом, повторяющиеся системные промпты. |
reasoning | Поддерживает явное управление рассуждением там, где доступно. | Сложное планирование, кодинг, аналитические рабочие процессы. |
logprobs | Поддерживает вывод вероятностей токенов. | Оценка, ранжирование, продвинутые NLP-рабочие процессы. |
Матрица совместимости семейств API
| Семейство API | Текст | Ввод изображений | Вызов инструментов | Структурированный вывод | Потоковая передача | Примечания |
|---|---|---|---|---|---|---|
| OpenAI Chat Completions | Да | Зависит от модели | Зависит от модели | Зависит от модели | Да | Лучший вариант по умолчанию для OpenAI-совместимых агентов и SDK. |
| OpenAI Responses | Да | Зависит от модели | Зависит от модели | Зависит от модели | Да | Рекомендуется для более новых агентских рабочих процессов в стиле OpenAI. |
| Anthropic Messages | Да | Зависит от модели | Зависит от модели | Зависит от модели | Да | Лучший вариант для Claude-совместимых клиентов и Claude Code. |
| Генерация изображений ciyuan_market | Нет | Зависит от модели | Нет | Нет | Нет | Использует асинхронный опрос задач или webhook. |
| Генерация видео ciyuan_market | Нет | Зависит от модели | Нет | Нет | Нет | Использует асинхронный опрос задач или webhook. |
Аутентификация
Каждый API-запрос использует bearer-токен. Храните ключи в серверных переменных окружения, ротируйте их при изменении доступа команды и записывайте идентификаторы запросов для отладки.
| Заголовок | Значение | Примечания |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Обязателен для каждого запроса. |
Content-Type | application/json | Обязателен для JSON-тел запросов. |
Рекомендации по безопасности ключей
- Храните API-ключи на сервере. Не раскрывайте ключи в браузерном или мобильном клиентском коде.
- Используйте отдельные ключи для разработки, staging-окружения, продакшена и сторонних интеграций.
- Ограничивайте область действия ключей по окружению, сервису, клиенту или тенанту при наличии.
- Ротируйте ключи после ухода сотрудников, изменения доступа подрядчиков или при подозрении на утечку.
- Храните ключи в менеджерах секретов или переменных окружения, а не в исходном коде.
Кодинг-агенты
ciyuan_market работает с кодинг-агентами и инструментами AI-разработки, которые
поддерживают OpenAI-совместимые или Anthropic-совместимые конечные точки API.
Используйте псевдонимы маршрутизации, такие как mwf/coding-auto, чтобы
ciyuan_market мог маршрутизировать запросы к лучшей доступной кодинг-модели без
необходимости разработчикам менять конфигурацию инструмента.
Универсальная настройка, совместимая с OpenAI
Используйте эту настройку для Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, агентов на базе LangChain, агентов на базе LlamaIndex и пользовательских OpenAI-совместимых сред выполнения агентов.
export OPENAI_BASE_URL="https://api.ciyuan-market.com/api/v1"
export OPENAI_API_KEY="$CIYUAN_MARKET_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Универсальная настройка, совместимая с Anthropic
Используйте эту настройку для клиентов, совместимых с Claude, и инструментов, ожидающих формат Anthropic Messages.
export ANTHROPIC_BASE_URL="https://api.ciyuan-market.com/api/anthropic"
export ANTHROPIC_API_KEY="$CIYUAN_MARKET_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
Рекомендуемые модели для агентов
| Сценарий использования | Рекомендуемый псевдоним | Требования |
|---|---|---|
| Общее программирование | mwf/coding-auto | Вызов инструментов, потоковая передача, сильные способности к программированию. |
| Быстрый кодинг-чат | mwf/coding-fast | Низкая задержка и потоковая передача. |
| Анализ больших репозиториев | mwf/coding-long | Длинный контекст и стабильный вывод. |
| Помощник в программировании с ограниченным бюджетом | mwf/low-cost | Более низкая цена и приемлемое качество кодинга. |
| Скриншоты UI / визуальный кодинг | mwf/vision-chat | Ввод изображений и текстовый вывод. |
Краткое руководство по Cursor
Используйте конечную точку, совместимую с OpenAI.
Base URL: https://api.ciyuan-market.com/api/v1
API Key: CIYUAN_MARKET_API_KEY
Model: mwf/coding-auto
Рекомендуемые шаги:
- Откройте настройки Cursor.
- Добавьте или включите конфигурацию OpenAI-совместимого API-ключа.
- Установите переопределение базового URL OpenAI на
https://api.ciyuan-market.com/api/v1. - Добавьте пользовательскую модель, например
mwf/coding-auto,mwf/coding-fastилиmwf/coding-long. - Используйте модель с поддержкой потоковой передачи и вызова инструментов для наилучшего поведения агента.
Устранение неполадок:
| Проблема | Рекомендованное решение |
|---|---|
| Модель не отображается | Добавьте имя модели вручную как пользовательскую модель. |
| Сбой вызова инструментов | Используйте модель с tool_calling: true на странице «Модели». |
| Потоковая передача прервана | Повторите с экспоненциальной задержкой или используйте псевдоним маршрутизации с резервом. |
| Ошибка 401 | Проверьте API-ключ и базовый URL. |
| Ошибка модели 404 | Убедитесь, что модель включена для аккаунта. |
Краткое руководство по Claude Code
Используйте Anthropic-совместимую конечную точку шлюза.
export ANTHROPIC_BASE_URL="https://api.ciyuan-market.com/api/anthropic"
export ANTHROPIC_API_KEY="$CIYUAN_MARKET_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
ciyuan_market поддерживает этот Anthropic-совместимый путь для совместимости с Claude Code и Anthropic SDK:
POST /api/v1/messages
Рекомендуемые требования:
| Требование | Причина |
|---|---|
| Формат запроса, совместимый с Anthropic Messages | Claude Code ожидает сообщения в стиле Anthropic. |
| Поддержка потоковой передачи | Claude Code полагается на UX потоковой передачи. |
| Поддержка вызова инструментов | Требуется для агентных кодинг-рабочих процессов. |
| Длинный контекст | Полезно для задач на уровне репозитория. |
| Стабильный резерв | Полезно для длительных кодинг-сессий. |
Краткое руководство по Codex
Используйте ciyuan_market как пользовательского OpenAI-совместимого провайдера моделей.
Пример конфигурации провайдера:
[model_providers.ciyuanmarket]
name = "ciyuan_market"
base_url = "https://api.ciyuan-market.com/api/v1"
env_key = "CIYUAN_MARKET_API_KEY"
wire_api = "responses"
model_provider = "ciyuanmarket"
model = "mwf/coding-auto"
Переменная окружения:
export CIYUAN_MARKET_API_KEY="br_xxx"
Рекомендуемые модели:
| Модель | Сценарий использования |
|---|---|
mwf/coding-auto | Модель кодинг-агента по умолчанию. |
mwf/coding-long | Контекст больших репозиториев. |
mwf/coding-fast | Быстрая итерация и небольшие изменения. |
Устранение неполадок:
| Проблема | Рекомендованное решение |
|---|---|
| Ошибка авторизации | Убедитесь, что env_key указывает на
CIYUAN_MARKET_API_KEY. |
| Модель не найдена | Добавьте псевдоним в консоли ciyuan_market или используйте прямой ID модели. |
| Ошибка Responses API | Используйте wire_api = "responses" только для моделей и
конечных точек, поддерживающих Responses. |
| Модель только для Chat Completions | Переключитесь на wire API, совместимый с чатом, если клиент поддерживает это. |
Краткое руководство по Hermes
Используйте OpenAI-совместимую конечную точку, если только ваше развертывание Hermes не настроено для другого протокола.
export OPENAI_BASE_URL="https://api.ciyuan-market.com/api/v1"
export OPENAI_API_KEY="$CIYUAN_MARKET_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Рекомендуемая политика моделей:
| Рабочая нагрузка Hermes | Модель |
|---|---|
| Общая генерация кода | mwf/coding-auto |
| Выполнение задач с низкой задержкой | mwf/coding-fast |
| Сканирование репозитория с длинным контекстом | mwf/coding-long |
| Фоновые задачи с ограниченным бюджетом | mwf/low-cost |
Краткое руководство по OpenClaw
Используйте OpenAI-совместимую конечную точку для конфигурации среды выполнения агента в стиле OpenAI.
export OPENAI_BASE_URL="https://api.ciyuan-market.com/api/v1"
export OPENAI_API_KEY="$CIYUAN_MARKET_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
Если OpenClaw поддерживает нескольких провайдеров, настройте ciyuan_market как OpenAI-совместимого провайдера и используйте псевдонимы маршрутизации ciyuan_market для выбора модели.
{
"provider": "openai-compatible",
"base_url": "https://api.ciyuan-market.com/api/v1",
"api_key_env": "CIYUAN_MARKET_API_KEY",
"model": "mwf/coding-auto"
}
Контрольный список совместимости агента
| Возможность | Требуется для |
|---|---|
| Потоковая передача | Хороший UX в терминале/редакторе. |
| Вызов инструментов | Агентный кодинг, редактирование файлов, выполнение команд. |
| Длинный контекст | Большие репозитории и многофайловые изменения. |
| Структурированные выводы | Планирование, декомпозиция задач, автоматизированные рабочие процессы. |
| Ввод изображений | Анализ скриншотов UI и рабочие процессы «дизайн в код». |
| Резерв | Стабильность в продакшене и длительные задачи. |
Использование консоли
Консоль ciyuan_market — это операционная плоскость управления для доступа к API, доступности моделей, политик маршрутизации, мониторинга использования и администрирования биллинга. Она предоставляет администраторам аккаунта централизованное представление ключей, моделей, запросов, кредитов и средств управления на уровне аккаунта для продакшен-трафика моделей.
Управление ключами API
Создавайте, ротируйте, отзывайте и помечайте API-ключи из консоли. Используйте отдельные ключи для разработки, staging-окружения, продакшена и отдельных сервисов, чтобы использование можно было аудировать и изолировать по окружению или приложению.
| Практика | Описание |
|---|---|
| Раздельные окружения | Используйте разные API-ключи для разработки, staging-окружения и продакшен-трафика. |
| Используйте описательные метки | Помечайте ключи по приложению, сервису, окружению или интеграции. |
| Регулярная ротация | Ротируйте ключи при изменении доступа или возможном раскрытии учетных данных. |
| Избегайте раскрытия на стороне клиента | Храните API-ключи только на серверных системах. Не раскрывайте ключи в браузерном или мобильном клиентском коде. |
| Мониторинг использования ключей | Просматривайте объём запросов, потребление кредитов и шаблоны ошибок по ключам. |
Список моделей
Используйте страницу «Модели» для просмотра моделей, доступных аккаунту. Каждая запись о модели может включать вендора, обслуживающего провайдера, модальность, поддерживаемые семейства API, длину контекста, флаги возможностей, статус доступности и информацию о ценах.
| Фильтр | Назначение |
|---|---|
| Вендор | Фильтр по вендору модели, такому как OpenAI, Anthropic, Google, Qwen, DeepSeek, или другим провайдерам. |
| Провайдер | Фильтр по обслуживающему или облачному провайдеру. |
| Модальность | Фильтр по поддержке текста, изображений, видео, эмбеддингов, аудио или мультимодальности. |
| Возможность | Фильтр по потоковой передаче, вызову инструментов, структурированным выводам, зрению, кэшированию промптов или поддержке рассуждений. |
| Доступность | Определяйте модели, которые в настоящее время доступны аккаунту. |
Для продакшен-приложений проверяйте возможности моделей перед включением трафика. Некоторые параметры и функции зависят от модели и могут не поддерживаться во всех семействах API.
Использование и журналы
Представление «Использование и журналы» обеспечивает оперативную видимость API-трафика. Команды могут проверять объём запросов, выбранные модели, разрешённые цели маршрутизации, потребление кредитов, задержку, коды ошибок и идентификаторы запросов.
- Устранение неполадок неудачных запросов.
- Выявление дорогостоящих рабочих нагрузок.
- Сравнение использования моделей между приложениями и окружениями.
- Проверка поведения маршрутизации и резерва.
- Исследование проблем задержки или доступности провайдера.
- Предоставление идентификаторов запросов при обращении в поддержку.
Каждый ответ API включает или раскрывает идентификатор запроса ciyuan_market. Сохраняйте этот идентификатор в журналах вашего приложения для повышения эффективности отладки в продакшене и эскалации поддержки.
Резерв
Резерв (fallback) — это механизм отказоустойчивости ciyuan_market. Когда основная модель или политика маршрутизации даёт сбой, система автоматически переключается на резервную модель, чтобы продолжить обработку запроса. Это сохраняет отзывчивость приложения и минимизирует риск нарушения работы сервиса.
Резерв действует как страховка, поддерживая бесперебойную работу приложения даже при сбое модели, достижении лимита квоты или колебаниях сети.
Почему важен резерв
В продакшене сервисы моделей могут столкнуться с рядом непредсказуемых проблем:
- Сбой сервиса модели: вышестоящий API временно недоступен или превышает время ожидания.
- Колебания производительности: высокая нагрузка на модель приводит к медленным или неудачным ответам.
- Сбой маршрутизации: все модели-кандидаты, выбранные умной маршрутизацией, становятся недоступными.
Резерв поддерживает доступность вашего приложения, предоставляя надёжный резервный путь.
Ключевые преимущества
| Преимущество | Описание |
|---|---|
| Высокая доступность | Автоматическое переключение при сбое поддерживает работу сервиса и снижает влияние простоев. |
| Прозрачное переключение | Система переключает модели автоматически — изменения кода приложения не требуются. |
| Гибкая конфигурация | Поддерживается конфигурация как на уровне запроса, так и на уровне аккаунта для разных сценариев. |
| Оптимизация затрат | Выберите более экономичную модель в качестве резерва для контроля затрат в экстренных случаях. |
| Централизованное управление | Настройте один раз на уровне аккаунта, и это автоматически применяется к каждому запросу. |
Глобальная конфигурация резервной модели
ciyuan_market поддерживает настройку глобальной резервной модели из бэкенда консоли. Все запросы автоматически используют эту модель в качестве резерва при сбое.
Как настроить:
- Перейдите на страницу настроек стратегии ciyuan_market.
- Найдите настройку Модель резерва по умолчанию.
- Выберите вашу глобальную резервную модель из выпадающего списка.
- Сохраните настройку, чтобы применить её немедленно.
Преимущества глобальной конфигурации:
- Изменения кода не требуются: настройте один раз, и это применяется глобально, без необходимости повторять настройку в каждом запросе.
- Централизованное управление: управляйте политикой резерва в одном месте для более удобной корректировки и мониторинга.
- Упрощённое обслуживание: снижает сложность кода и вероятность ошибок конфигурации.
- Гибкое переопределение: конфигурация резерва на уровне запроса имеет приоритет и может переопределять глобальную настройку для конкретных сценариев.
Конфигурация резерва на уровне запроса
Для конкретных бизнес-сценариев можно указать резервную модель в отдельном запросе, чтобы переопределить глобальную конфигурацию.
Укажите резервную модель с помощью параметра router.fallBackModels:
{
"model": "claude-sonnet-4",
"messages": [
{
"role": "user",
"content": "Explain what quantum computing is"
}
],
"router": {
"fallBackModels": ["glm-5.2"]
}
}
Правила приоритета
При наличии нескольких конфигураций резерва приоритет распределяется от высшего к низшему:
router.fallBackModelsна уровне запроса: резервная модель, указанная в отдельном запросе.- Глобальная модель резерва по умолчанию: глобальная резервная модель, настроенная в консоли.
- Без резерва: если ни одна из них не настроена, запрос возвращает ошибку при сбое.
- Если все резервные модели дают сбой, система возвращает причину сбоя последней испробованной модели.
- При срабатывании резерва ответ указывает фактически использованную модель, что облегчает мониторинг и анализ.
Администрирование аккаунта
В зависимости от типа аккаунта консоль может включать включение моделей на уровне аккаунта, элементы управления реселлером или дистрибьютором, конфигурацию биллинга и настройки доступа. Администраторы могут использовать эти элементы управления для согласования доступа к моделям, видимости использования и ответственности за биллинг с приложениями, клиентскими аккаунтами или бизнес-подразделениями.
Контрольный список производственных операций
| Пункт | Рекомендация |
|---|---|
| API-ключи | Используйте выделенные продакшен-ключи с понятными метками. |
| Модели | Подтвердите доступность модели, цены, длину контекста и требуемые возможности. |
| Маршрутизация | Настройте псевдонимы маршрутизации или политики резерва для критически важных рабочих нагрузок. |
| Журналы | Убедитесь, что идентификаторы запросов фиксируются в журналах приложения. |
| Биллинг | Подтвердите баланс кошелька, статус тарифа и правила списания кредитов. |
| Ограничения скорости | Просмотрите RPM, TPM, параллелизм и лимиты медиазадач на уровне аккаунта. |
| Оповещения | Отслеживайте рост использования, баланс кредитов, ошибки и доступность провайдера. |
Биллинг и кредиты
ciyuan_market использует модель биллинга на основе кредитов для текстовых, графических, видеоматериалов и других поддерживаемых рабочих нагрузок моделей. Кредиты предоставляют единую единицу измерения для использования нескольких моделей и провайдеров, что позволяет командам согласованно управлять потреблением между модальностями и семействами API.
Подробная информация о ценах на модели доступна на странице «Модели» или через API метаданных моделей. Цены могут различаться в зависимости от модели, провайдера, модальности, разрешения, типа токенов, длины вывода, длительности задачи, типа аккаунта и коммерческого соглашения.
Пополнение и кошелёк
Аккаунты могут добавлять кредиты на кошелёк с оплатой по факту использования для гибкого использования. Кредиты кошелька используются после того, как кредиты месячного тарифа и пакеты ресурсов будут израсходованы, если к аккаунту не применяется пользовательское правило биллинга.
Кредиты кошелька не истекают, если иное не указано в применимых коммерческих условиях. При пополнении кошелька с оплатой по факту использования взимается сервисный сбор.
Месячные тарифы и пакеты ресурсов
Каждый пользователь или аккаунт может выбрать один активный месячный тариф. Месячные тарифы предоставляют определённый объём пропускной способности использования, коммерческие условия и конфигурацию доступа на уровне аккаунта для расчётного периода.
Пользователи также могут покупать несколько пакетов ресурсов для дополнительной пропускной способности. Пакеты ресурсов позволяют отделить обязательное использование от баланса кошелька с оплатой по факту и полезны для интенсивного использования текста, изображений, видео или выделенных рабочих нагрузок.
Порядок списания
Если не настроены пользовательские правила биллинга, кредиты списываются в следующем порядке:
| Приоритет | Источник кредитов | Описание |
|---|---|---|
| 1 | Месячный тариф | Включённая месячная пропускная способность использования расходуется первой. |
| 2 | Пакеты ресурсов | Дополнительно приобретённые пакеты расходуются после кредитов месячного тарифа. |
| 3 | Кошелёк с оплатой по факту | Баланс кошелька расходуется после кредитов тарифа и пакетов ресурсов. |
Для аккаунтов с пользовательскими коммерческими условиями порядок списания, правила истечения срока действия, включённое использование и цены могут отличаться. Специфичные для аккаунта правила отображаются в консоли или предоставляются через коммерческое соглашение.
Индивидуальное ценообразование
Ценообразование может быть настроено для каждого пользователя или аккаунта. Корпоративные клиенты, аккаунты реселлеров, аккаунты дистрибьюторов и клиенты с большим объёмом использования могут иметь право на индивидуальное ценообразование. Свяжитесь с отделом продаж для получения предложения.
Индивидуальное ценообразование может быть настроено по аккаунту, модели, провайдеру, модальности, региону, объёму использования или коммерческому соглашению. Когда включено индивидуальное ценообразование, консоль и API биллинга отражают специфичные для аккаунта цены и правила списания там, где это доступно.
Единицы ценообразования
Разные модальности моделей используют разные единицы измерения. ciyuan_market конвертирует эти единицы в кредиты в соответствии с правилами ценообразования модели.
| Модальность | Обычная основа ценообразования |
|---|---|
| Текст | Входные токены, выходные токены, кэшированные токены чтения, кэшированные токены записи, токены рассуждений или специфичные для модели категории токенов. |
| Изображение | Модель, разрешение, количество сгенерированных изображений, использование входных изображений, режим редактирования или настройка качества. |
| Видео | Модель, разрешение вывода, сгенерированные секунды, соотношение сторон, использование входных изображений или видео и тип задачи. |
| Эмбеддинги | Входные токены или количество записей эмбеддингов. |
| Аудио | Длительность ввода, длительность вывода, длина транскрипции или специфичные для модели единицы аудио. |
Единицы ценообразования могут различаться в зависимости от модели. Всегда обращайтесь к странице сведений о модели или метаданным цен перед включением модели в продакшене.
Атрибуция использования
Использованием ciyuan_market можно просматривать по аккаунту, API-ключу, модели, модальности или диапазону времени. Это позволяет командам относить затраты к приложениям, окружениям, клиентам или внутренним бизнес-подразделениям.
| Измерение | Описание |
|---|---|
| API-ключ | Группировка использования по приложению, сервису или окружению. |
| Модель | Сравнение затрат и объёма по выбранной модели. |
| Разрешённая модель | Просмотр фактически использованной модели после маршрутизации или резерва. |
| Модальность | Разделение использования текста, изображений, видео, эмбеддингов и аудио. |
| Диапазон времени | Просмотр дневных, месячных или пользовательских отчётных периодов. |
| Метаданные | Группировка использования по пользовательским метаданным запроса, таким как ID клиента, ID тенанта, ID пользователя или окружение. |
Баланс кредитов
Проверьте, сколько кредитов доступно на вашем аккаунте. Баланс разделён на три кошелька, которые списываются по порядку: месячный лимит тарифа, приобретённые пакеты ресурсов и кошелёк с оплатой по факту. Также доступен общий ресурсный итог (месячный тариф + пакеты ресурсов, без учёта оплаты по факту) для отслеживания включённого использования отдельно от расходов на пополнение.
Чтобы получить эти данные программно, см.
GET /v1/billing/balance в Справочнике
API.
Сведения об использовании
Просматривайте постраничный хронологический список отдельных записей об использовании для отчётности, мониторинга и внутреннего распределения затрат. Каждая запись показывает модель, тип модели (текст, изображение или видео), списанные кредиты и разбивку того, из какого кошелька было произведено каждое списание. Результаты можно фильтровать по конкретному диапазону времени.
Чтобы получить эти данные программно, см.
GET /v1/usage в Справочнике API.
История транзакций
Используйте историю транзакций для просмотра движений кредитов, включая пополнения, распределения по тарифам, предоставления пакетов ресурсов, списания за использование, корректировки и административные исправления.
Чтобы получить эти данные программно, см.
GET /v1/billing/transactions в
Справочнике API.
Неудачные запросы и возвраты
Ошибки валидации, ошибки аутентификации и ошибки разрешений, как правило, не оплачиваются, поскольку выполнения модели не происходит. Запросы, достигающие вышестоящей модели или генерирующие частичный вывод, могут потреблять кредиты в зависимости от модели, провайдера и состояния ответа.
Для асинхронных задач генерации изображений и видео поведение биллинга зависит от того, была ли задача принята, начата, завершена, выполнена с ошибкой или отменена. Ответ с деталями задачи включает информацию об использовании, когда кредиты были потреблены.
Пополнения, месячные тарифы, пакеты ресурсов и потреблённые кредиты возврату не подлежат, если иное не предусмотрено применимым коммерческим соглашением или не требуется по закону.
Справочник API
Общие соглашения
Базовый URL
Все конечные точки обслуживаются с префиксом /v1.
Аутентификация
Вызовы к конечным точкам /v1/* используют аутентификацию
API Key (не JWT). API-ключ передаётся через следующий заголовок:
| Заголовок | Формат | Описание |
|---|---|---|
Authorization | Bearer <api_key> | В стиле OpenAI. Anthropic-совместимая конечная точка также принимает
x-api-key с anthropic-version: 2023-06-01. |
Отсутствующие или недействительные ключи возвращают 401.
Предварительная проверка баланса
Все конечные точки вызова моделей выполняют предварительную проверку баланса перед выполнением:
- Недостаточный баланс возвращает
Insufficient credit, что соответствует:- Протокол OpenAI: HTTP
400,code = insufficient_quota - Протокол Anthropic: HTTP
402,type = billing_error
- Протокол OpenAI: HTTP
- Некоторые конечные точки также оценивают минимальную стоимость по модели для второй предварительной проверки.
POST https://api.ciyuan-market.com/api/v1/chat/completions
Конечная точка, совместимая с OpenAI Chat Completions. Поддерживает потоковый и непотоковый режимы, вызовы инструментов, режим JSON и мультимодальный ввод.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
model | String | Да | Имя модели. |
messages | Message[] | Да | Сообщения диалога. |
stream | Boolean | Нет | Потоковый режим, по умолчанию false. |
temperature | Double | Нет | Температура выборки. |
max_tokens | Integer | Нет | Максимальное количество выходных токенов. |
top_p | Double | Нет | Ядерная выборка (nucleus sampling). |
presence_penalty | Double | Нет | — |
frequency_penalty | Double | Нет | — |
tools | Tool[] | Нет | Определения инструментов. |
tool_choice | String|Object | Нет | auto / none / required / конкретная
функция. |
response_format | Object | Нет | {type, json_schema:{name,schema,strict}};
text/json_object/json_schema. |
parallel_tool_calls | Boolean | Нет | — |
metadata | Map | Нет | Прокси-метаданные. |
Поля Message:
| Поле | Тип | Описание |
|---|---|---|
role | String | system / user / assistant /
tool. |
content | String|Array | Простой текст или массив блоков мультимодального содержимого
([{type:"text",text},{type:"image_url",image_url:{url}}]). |
tool_call_id | String | Связь с tool_calls при role=tool. |
tool_calls | ToolCall[] | Присутствует, когда role=assistant совершает вызовы
инструментов. |
| Поле | Тип | Описание |
|---|---|---|
type | String | Фиксированное значение function. |
function | Object | Определение функции. |
function.name | String | Имя функции. |
function.description | String | Описание функции. |
function.parameters | Object | JSON Schema для входных данных. |
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/chat/completions \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}],
"stream": false,
"temperature": 0.7
}'
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1721380000,
"model": "glm-5.2",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Hangzhou is ..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 12, "completion_tokens": 18, "total_tokens": 30}
}
Поля ответа (непотоковый):
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор завершения. |
object | String | Фиксированное значение chat.completion. |
created | Long | Метка времени создания (в секундах). |
model | String | Имя модели. |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор вызова инструмента. |
type | String | Фиксированное значение function. |
function | Object | Сведения о вызове функции. |
function.name | String | Имя функции. |
function.arguments | Object | Аргументы функции. |
Пример потокового ответа:
data: {"object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":"..."}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"..."}}]}
data: [DONE]
POST https://api.ciyuan-market.com/api/v1/responses
Конечная точка, совместимая с OpenAI Responses. Использует input вместо
messages, instructions вместо системного сообщения и блок
text вместо response_format.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
model | String | Да | Имя модели. |
input | String|Array | Да | Простая строка (сообщение пользователя) или массив объектов сообщений. |
instructions | String | Нет | Системный промпт. |
stream | Boolean | Нет | По умолчанию false. |
max_output_tokens | Integer | Нет | Максимальное количество выходных токенов. |
temperature | Double | Нет | По умолчанию 1. |
top_p | Double | Нет | — |
tools | Tool[] | Нет | Верхнеуровневые {type, name, description, parameters}. |
tool_choice | String|Object | Нет | auto/none/required/{type,name}. |
text | Object | Нет | {format:{type, name, schema, strict}};
text/json_object/json_schema. |
metadata | Map | Нет | — |
previous_response_id | String | Нет | Идентификатор предыдущего ответа для многоходового диалога. |
parallel_tool_calls | Boolean | Нет | — |
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/responses \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"input": "Describe Hangzhou in one sentence.",
"instructions": "Be concise.",
"stream": false
}'
{
"id": "resp_xxx",
"object": "response",
"model": "glm-5.2",
"status": "completed",
"created_at": 1721380000,
"output": [
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"content": [{"type": "output_text", "text": "Hangzhou is ..."}],
"status": "completed"
}
],
"usage": {"input_tokens": 12, "output_tokens": 18, "total_tokens": 30}
}
Поля ответа (непотоковый):
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор ответа. |
object | String | Фиксированное значение response. |
model | String | Имя модели. |
status | String | например, completed. |
created_at | Long | Метка времени создания (в секундах). |
output | Array | Элементы вывода. Элементы сообщений:
{id, type:"message", role, content:[{type:"output_text",
text}], status}. Элементы вызова инструментов:
{type:"function_call", id, name, call_id, arguments, status}. |
usage | Object | {input_tokens, output_tokens, total_tokens}. Для моделей Claude
input_tokens включает cache_read, а
output_tokens включает cache_write. |
Потоковая передача следует событиям Responses API:
| Событие | Описание |
|---|---|
response.created | Начало потока ответа. |
response.output_text.delta | Инкрементное обновление текстового вывода. |
response.completed | Конец потока ответа. |
POST https://api.ciyuan-market.com/api/v1/messages
Конечная точка, совместимая с Anthropic Messages. Принимает заголовки
x-api-key и anthropic-version: 2023-06-01. Блоки содержимого
поддерживают text, image, tool_use,
tool_result, thinking и redacted_thinking.
| Поле | Тип | Обязательно | JSON-поле | Описание |
|---|---|---|---|---|
model | String | Да | model | Имя модели. |
messages | Message[] | Да | messages | Сообщения диалога. |
system | String|Array | Нет | system | Системный промпт, строка или [{type,text}]. |
maxTokens | Integer | Да | max_tokens | Максимальное количество выходных токенов. |
stream | Boolean | Нет | stream | Потоковая передача. |
temperature | Double | Нет | temperature | — |
topP | Double | Нет | top_p | — |
topK | Integer | Нет | top_k | — |
tools | Tool[] | Нет | tools | Определения инструментов (input_schema). |
toolChoice | Object | Нет | tool_choice | — |
metadata | Map | Нет | metadata | — |
thinking | Object | Нет | thinking | Конфигурация расширенного мышления. |
stopSequences | Object | Нет | stop_sequences | — |
anthropicBeta | Object | Нет | anthropic_beta | Заголовок бета-функции. |
| Поле | Тип | Описание |
|---|---|---|
role | String | Роль сообщения, например user / assistant. |
content | String|ContentBlock[] | Простой текст или массив блоков содержимого. |
| Поле | Тип | Описание |
|---|---|---|
type | String | Одно из text, image, tool_use,
tool_result, thinking,
redacted_thinking. |
text | String | Присутствует, когда тип — text. |
source | Object | Присутствует, когда тип — image. |
Примеры блоков изображений:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
| Поле | Тип | Описание |
|---|---|---|
name | String | Имя функции. |
description | String | Описание функции. |
input_schema | Object | JSON Schema для входных данных. |
cache_control | Object | Необязательное управление кэшем. |
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/messages \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-4.6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}]
}'
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4.6",
"content": [{"type": "text", "text": "Hangzhou is ..."}],
"stop_reason": "end_turn",
"usage": {"input_tokens": 12, "output_tokens": 18}
}
Поля ответа (непотоковый):
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор сообщения. |
type | String | Фиксированное значение message. |
role | String | Фиксированное значение assistant. |
model | String | Имя модели. |
content | ContentBlock[] | Блоки содержимого ответа (например, {type:"text", text},
{type:"tool_use", ...}). |
stop_reason | String | например, end_turn, tool_use,
max_tokens. |
usage | Object | {input_tokens, output_tokens}. |
| Событие | Описание |
|---|---|
message_start | Начало потока сообщений. |
content_block_start | Начало нового блока содержимого. |
content_block_delta | Инкрементное обновление для блока содержимого. |
content_block_stop | Конец блока содержимого. |
message_delta | Инкрементное обновление для сообщения. |
message_stop | Конец потока сообщений. |
GET https://api.ciyuan-market.com/api/v1/models
Возвращает все онлайн-модели API, которые включены.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/models \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"object": "list",
"data": [
{
"id": "glm-5.2",
"object": "model",
"display_name": "glm-5.2",
"created": 1721380000,
"owned_by": "Zai",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"context_length": 128000,
"description": "..."
}
]
}
Поля каждой записи модели (data[]):
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор модели. |
object | String | Фиксированное значение model. |
display_name | String | Отображаемое имя. |
created | Long | Метка времени создания (в секундах). |
owned_by | String | Владелец / вендор. |
input_modalities | String[] | например, ["text","image"]. |
output_modalities | String[] | например, ["text"]. |
context_length | Integer | Максимальная длина контекста. |
description | String | Описание модели. |
GET https://api.ciyuan-market.com/api/v1/models/{model}
Возвращает одну модель с той же структурой, что и элемент списка. Возвращает HTTP 404, если модель не существует.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Ответ при успешном выполнении: один объект модели с теми же полями, что и элемент
списка /v1/models.
Если модель не существует, возвращается HTTP 404:
{"error": {"message": "The model 'xxx' does not exist", "type": "invalid_request_error", "code": "invalid_model_error"}}
GET https://api.ciyuan-market.com/api/v1/image-models
Запросите поддерживаемые разрешением, соотношения сторон и максимальные количества для
модели генерации изображений перед вызовом /v1/image-generations.
Аутентификация не требуется.
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор модели. |
object | String | Фиксированное значение image_model. |
displayName | String | Отображаемое имя. |
description | String | Описание модели. |
icon | String | URL иконки. |
created | Long | Метка времени создания (в секундах). |
maxCount | Integer | Максимум изображений за запрос. |
fileMax | Integer | Максимум референсных изображений. Если 0, генерация изображения по изображению не поддерживается. |
resolutions | String[] | Поддерживаемые разрешения, например,
["720p","1080p"]. |
ratios | String[] | Поддерживаемые соотношения сторон, например,
["1:1","3:2"]. |
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/image-models \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"object": "list",
"data": [
{
"id": "gpt-image-2",
"object": "image_model",
"displayName": "GPT Image 1",
"description": "...",
"icon": "...",
"created": 1721380000,
"maxCount": 4,
"fileMax": 10,
"resolutions": ["720p", "1080p"],
"ratios": ["1:1", "3:2"]
}
]
}
GET https://api.ciyuan-market.com/api/v1/video-models
Запросите поддерживаемые значения videoType, диапазон длительности,
разрешения и соотношения сторон для видеомодели перед вызовом
/v1/video-generations. Аутентификация не требуется.
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор модели. |
object | String | Фиксированное значение video_model. |
displayName | String | Отображаемое имя. |
description | String | Описание модели. |
icon | String | URL иконки. |
created | Long | Метка времени создания (в секундах). |
allowedVideoTypes | VideoTypeOption[] | Список поддерживаемых videoType. |
videoDurationMin | Integer | Минимум секунд на клип. |
videoDurationMax | Integer | Максимум секунд на клип. |
videoDurationSuggest | Integer[] | Рекомендуемые шаги длительности, например [5,8,10]. |
resolutions | String[] | Поддерживаемые разрешения. |
ratios | String[] | Поддерживаемые соотношения сторон. |
resolutionOptions | ResolutionOption[] | Структурированные комбинации разрешение+соотношение+размер. |
fileMax | Integer | Максимум референсных ресурсов. |
Поля VideoTypeOption:
| Поле | Тип | Описание |
|---|---|---|
code | Integer | Значение videoType для передачи в
/v1/video-generations. |
name | String | Локализованное имя типа (text-to-video / image-to-video / ...). |
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/video-models \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"object": "list",
"data": [
{
"id": "sora-2",
"object": "video_model",
"displayName": "Sora 2",
"description": "...",
"icon": "...",
"created": 1721380000,
"allowedVideoTypes": [
{"code": 1, "name": "text-to-video"},
{"code": 2, "name": "image-to-video"},
{"code": 3, "name": "image-to-video (first/last frame)"}
],
"videoDurationMin": 5,
"videoDurationMax": 10,
"videoDurationSuggest": [5, 8, 10],
"resolutions": ["1080p", "720p"],
"ratios": ["16:9", "9:16"],
"fileMax": 5
}
]
}
Описание полей ценовых уровней
4 endpoint запроса моделей /v1/models, /v1/models/{model},
/v1/image-models и /v1/video-models возвращают
действующую цену биллинга для текущего вызывающего (пользователя API
Key), полностью совпадающую с фактическим списанием, и возвращают
все ценовые уровни модели.
Различие в именовании полей: /v1/models и
/v1/models/{model} используют стиль OpenAI snake_case
(price_tiers); /v1/image-models и
/v1/video-models используют camelCase (priceTiers). Структуры
полностью одинаковы.
price_tiers / priceTiers — массив, каждый элемент — ценовой
уровень:
| Поле | Тип | Описание |
|---|---|---|
outputPrice | decimal | Действующая выходная цена за единицу для текущего вызывающего |
cachePrice | decimal | Цена кэша (универсальные модели, используется в старой формуле биллинга) |
cacheReadPrice | decimal | Цена чтения кэша (только для Bedrock Claude) |
cacheWritePrice | decimal | Цена записи кэша (только для Bedrock Claude) |
ratio | decimal | Коэффициент биллинга. Режим FIXED равен 1; режим RATIO — коэффициент пользователя/группы |
mode | string | Режим ценообразования: RATIO / FIXED |
planId | string | ID совпавшего ценового плана, может быть null |
Три типа моделей используют одну структуру; отличается только заполнение описательных полей. Неприменимые поля равны null:
| Тип модели | UNIT | Эффективные описательные поля |
|---|---|---|
| Текст | token | region / bandMin / bandMax |
| Изображение | image | resolution / clarity |
| Видео | video | resolution / clarity |
Смысл цены: возвращаемые значения inputPrice / outputPrice /
cacheReadPrice / cacheWritePrice — это конечные расчётные
единицы цены для текущего пользователя API Key после пошагового разрешения цепочки цен
(chain)→ guidance → базовая цена, совпадающие с фактическим списанием. Единица цены,
видимая вызывающей стороной, зависит от принадлежности к цепочке цен (reseller /
distributor / компания / пользовательская конфигурация).
Фактическое списание = объём ÷ quantity × соответствующая цена × ratio. При посекундном биллинге видео: фактическое списание = duration × outputPrice × ratio.
Граничные случаи и обработка исключений (read-only endpoint не вернёт 500 из-за проблем конфигурации цен)
| Сценарий | Поведение |
|---|---|
| Ошибка разрешения одного уровня (ценовая политика запрещает доступ, конфигурация отсутствует) | Пропустить этот уровень, записать warn-лог и продолжить разрешение остальных уровней |
| Все уровни модели не удалось разрешить | Пустой массив [], модель возвращается нормально |
| У модели нет ценовой конфигурации | Пустой массив [] |
| Разбор цен выбросил необработанное исключение | Общий try-catch, вернуть пустой массив, endpoint всё ещё возвращает 200 |
Пример ответа (/v1/models, текстовая модель):
{
"object": "list",
"data": [
{
"id": "gpt-4o",
"object": "model",
"display_name": "gpt-4o",
"context_length": 128000,
"price_tiers": [
{
"region": "GLOBAL",
"bandMin": null,
"bandMax": null,
"resolution": null,
"clarity": null,
"unit": "token",
"quantity": 1000,
"description": "за 1 тыс. токенов",
"inputPrice": 0.0025,
"outputPrice": 0.01,
"cachePrice": 0.00125,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Пример ответа (/v1/image-models, модель изображения, структура
priceTiers та же, unit — image):
{
"object": "list",
"data": [
{
"id": "dall-e-3",
"object": "image_model",
"displayName": "dall-e-3",
"resolutions": ["1024x1024", "1792x1024", "1024x1792"],
"priceTiers": [
{
"region": null,
"bandMin": null,
"bandMax": null,
"resolution": "1024x1024",
"clarity": "standard",
"unit": "image",
"quantity": 1,
"description": "за изображение",
"inputPrice": 0,
"outputPrice": 0.04,
"cachePrice": 0,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
POST https://api.ciyuan-market.com/api/v1/image-generations
Асинхронно отправьте задачу генерации изображений. Немедленно возвращает
taskId; получите результат опросом
GET /v1/image-generations/{taskId} или через вебхук
callbackUrl.
Значения model, поддерживаемые значения resolution /
ratio, верхний предел count и лимит загрузки референсных
изображений (fileMax) необходимо сначала получить из
GET /v1/image-models. Принимаются только значения, заявленные в спецификации модели.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
text | String | Да | Промпт. |
model | String | Да | Имя модели. |
imageUrls | String[] | Нет | URL референсных изображений (image-to-image). |
count | Integer | Нет | Количество изображений (≥0). |
resolution | String | Нет | Разрешение (см. /v1/image-models). |
ratio | String | Нет | Соотношение сторон. |
callbackUrl | String | Нет | URL вебхука на уровне задачи. |
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/image-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": []
}'
{
"code": 200,
"message": "image task is commit",
"data": {"taskId": "img_xxx"}
}
Ответы при ошибках:
// Insufficient credit
{ "code": 500, "message": "Insufficient credit" }
// Model not found
{ "code": 404, "message": "Model not found: xxx" }
GET https://api.ciyuan-market.com/api/v1/image-generations/{taskId}
Опрос задачи генерации изображений. status имеет значение
pending / success / failed. images —
это JSON-строка массива URL изображений; text содержит любое текстовое
описание, добавленное моделью (например, мультимодальный вывод Gemini), иначе
null.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/image-generations/img_xxx \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"taskId": "img_xxx",
"status": "success",
"errorMessage": null,
"images": "[\"https://.../1.png\"]",
"text": null
}
}
Поля data ответа:
| Поле | Тип | Описание |
|---|---|---|
taskId | String | Идентификатор задачи. |
status | String | pending / success / failed. |
errorMessage | String | Причина ошибки, null при успехе. |
images | String | JSON-строка массива URL изображений, например,
"[\"https://.../1.png\"]". |
text | String | Текстовое описание, добавленное моделью (например, мультимодальный вывод
Gemini); иначе null. |
Задача не найдена:
{ "code": 500, "message": "task not found" }
Если при отправке был предоставлен callbackUrl, сервер отправляет
окончательный результат success / failed через вебхук с той же
структурой data.
Полный пример (отправка + опрос)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ImageGenerationExample {
private static final String BASE = "https://api.ciyuan-market.com/api/v1";
private static final String API_KEY = System.getenv("CIYUAN_MARKET_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task.
String body = "{"
+ "\"model\":\"seedream-4.5\","
+ "\"text\":\"A cat drinking water by the river\","
+ "\"count\":1,"
+ "\"resolution\":\"2k\","
+ "\"ratio\":\"1:1\","
+ "\"imageUrls\":[]"
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status.
String status = "pending";
while ("pending".equals(status)) {
Thread.sleep(15_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
status = extract(poll.body(), "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("image generation failed: " + status);
}
// images is a JSON-stringified array of URLs.
String images = extract(pollResult(http, taskId), "images");
System.out.println("images = " + images);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
private static String pollResult(HttpClient http, String taskId) throws Exception {
return http.send(HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString()).body();
}
}
import os
import time
import requests
BASE = "https://api.ciyuan-market.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CIYUAN_MARKET_API_KEY']}"}
# 1. Submit the task.
resp = requests.post(
f"{BASE}/image-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": [],
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status.
while True:
time.sleep(15)
poll = requests.get(f"{BASE}/image-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"image generation failed: {data.get('errorMessage')}")
# images is a JSON-stringified array of URLs.
import json
images = json.loads(data["images"])
print(f"images = {images}")
POST https://api.ciyuan-market.com/api/v1/video-generations
Асинхронно отправьте задачу генерации видео. Немедленно возвращает taskId;
получите результат опросом GET /v1/video-generations/{taskId} или через
вебхук callbackUrl.
Значения model, разрешённые значения videoType, диапазон
длительности (videoDurationMin/Max), поддерживаемые
resolution / ratio и лимит загрузки референсных ресурсов
(fileMax) необходимо сначала получить из
GET /v1/video-models. Принимаются только коды videoType, перечисленные в
allowedVideoTypes этой модели.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
text | String | Да | Промпт. |
model | String | Да | Имя модели. |
videoType | Integer | Да | 1 text-to-video / 2 image-to-video (первый кадр) / 3 image-to-video (первый+последний кадр) / 4 image-to-video (референс) / 5 все референсы. |
imageUrls | String[] | Нет | URL изображений. |
videoUrls | VideoUrl[]|String[] | Нет | URL видеоресурсов. |
audioUrls | String[] | Нет | URL аудиоресурсов. |
resolution | String | Нет | Разрешение. |
ratio | String | Нет | Соотношение сторон. |
duration | Long | Нет | Секунды (>0). |
callbackUrl | String | Нет | URL вебхука на уровне задачи. |
Примеры для каждого videoType:
1. Текст в видео (videoType=1)
Генерация видео только из текстового промпта; референсные ресурсы не требуются.
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/video-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0"
}'
2. Изображение в видео — первый кадр (videoType=2)
Предоставьте один начальный кадр в imageUrls; модель генерирует видео,
начиная с этого кадра.
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/video-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 2,
"text": "Happily shaking head",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": ["https://ciyuanmarket-flie.oss-accelerate.aliyuncs.com/test/first-frame.png"]
}'
3. Изображение в видео — первый и последний кадр (videoType=3)
Предоставьте и первый, и последний кадр в imageUrls (порядок:
[первый, последний]); модель генерирует переходное видео между двумя
кадрами.
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/video-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 3,
"text": "Put on the hat",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": [
"https://ciyuanmarket-flie.oss-accelerate.aliyuncs.com/test/first-frame.png",
"https://ciyuanmarket-flie.oss-accelerate.aliyuncs.com/test/last-frame.png"
]
}'
4. Изображение в видео — референс (videoType=4)
Предоставьте одно или несколько референсных изображений в imageUrls;
модель использует их стиль/содержимое как референс (не как обязательный первый/последний
кадр) для генерации видео.
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/video-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 4,
"text": "Two cats playing together",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "kling-v3-omni-video",
"imageUrls": [
"https://ciyuanmarket-flie.oss-accelerate.aliyuncs.com/test/ref-1.png",
"https://ciyuanmarket-flie.oss-accelerate.aliyuncs.com/test/ref-2.png"
]
}'
5. Все референсы (videoType=5)
Смешанные референсы изображений / видео / аудио. Указывайте референсные ресурсы по
позиции в промпте: 1-й элемент в imageUrls — это @图片 1, 1-й
в videoUrls — @视频 1, 1-й в audioUrls —
@音频 1. videoUrls также принимает простые строки URL.
curl --request POST \
--url https://api.ciyuan-market.com/api/v1/video-generations \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 5,
"text": "Use the first-person framing of @视频 1 and @音频 1 as background music. First-person tea ad; start frame is @图片 1 ... end frame is @图片 2.",
"model": "seedance-2.0",
"imageUrls": [
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic1.jpg",
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic2.jpg"
],
"videoUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_tea_video1.mp4"],
"audioUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_audio/r2v_tea_audio1.mp3"],
"resolution": "1080p",
"ratio": "16:9",
"duration": 11
}'
Ответ при отправке (для всех пяти типов):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}
GET https://api.ciyuan-market.com/api/v1/video-generations/{taskId}
Опрос задачи генерации видео. status имеет значение pending /
success / failed; videoUrl — URL сгенерированного
видео, а lastFrameUrl — URL последнего кадра (для сценариев
image-to-video).
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/video-generations/vid_xxx \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"status": "success",
"videoUrl": "https://.../out.mp4",
"lastFrameUrl": null,
"message": null
}
}
Поля data ответа:
| Поле | Тип | Описание |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL сгенерированного видео. |
lastFrameUrl | String | URL последнего кадра (для сценариев image-to-video); иначе
null. |
message | String | Причина ошибки, null при успехе. |
Если при отправке был предоставлен callbackUrl, сервер отправляет
окончательный результат через вебхук с той же структурой data.
Полный пример (отправка + опрос)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class VideoGenerationExample {
private static final String BASE = "https://api.ciyuan-market.com/api/v1";
private static final String API_KEY = System.getenv("CIYUAN_MARKET_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task (videoType=1: text-to-video).
String body = "{"
+ "\"videoType\":1,"
+ "\"text\":\"A cat jumping on a bed\","
+ "\"resolution\":\"480p\","
+ "\"ratio\":\"16:9\","
+ "\"duration\":4,"
+ "\"model\":\"seedance-2.0\""
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status. Video tasks take longer — poll every 20s.
String status = "pending";
String lastBody = null;
while ("pending".equals(status)) {
Thread.sleep(20_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
lastBody = poll.body();
status = extract(lastBody, "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("video generation failed: " + status);
}
String videoUrl = extract(lastBody, "videoUrl");
System.out.println("videoUrl = " + videoUrl);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
}
import os
import time
import requests
BASE = "https://api.ciyuan-market.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CIYUAN_MARKET_API_KEY']}"}
# 1. Submit the task (videoType=1: text-to-video).
resp = requests.post(
f"{BASE}/video-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status. Video tasks take longer — poll every 20s.
while True:
time.sleep(20)
poll = requests.get(f"{BASE}/video-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"video generation failed: {data.get('message')}")
print(f"videoUrl = {data['videoUrl']}")
if data.get("lastFrameUrl"):
print(f"lastFrameUrl = {data['lastFrameUrl']}")
GET https://api.ciyuan-market.com/api/v1/billing/balance
Возвращает баланс аккаунта, разделённый на три кошелька: месячный тариф, пакеты ресурсов и кредиты с оплатой по факту.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/billing/balance \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
{
"totalCredit": 128.50,
"totalResourceCredit": 30.00,
"wallets": {
"monthlyPlan": {"id": "pkg_xxx", "credit": 50.00, "name": "Monthly plan"},
"resourcePacks": [
{"id": "rp_xxx", "credit": 30.00, "name": "Video resource pack"}
],
"payAsYouGo": 48.50
}
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
totalCredit | BigDecimal | Общий баланс. |
totalResourceCredit | BigDecimal | Сумма балансов пакетов ресурсов. |
wallets.monthlyPlan | WalletDetail | Месячный тариф (null, если отсутствует). |
wallets.resourcePacks | WalletDetail[] | Список пакетов ресурсов. |
wallets.payAsYouGo | BigDecimal | Баланс с оплатой по факту. |
Поля WalletDetailVO::
| Поле | Тип | Описание |
|---|---|---|
id | String | Идентификатор кошелька. |
credit | BigDecimal | Кредиты на балансе. |
name | String | Название кошелька. |
GET https://api.ciyuan-market.com/api/v1/usage
Постраничные детали биллинга вызовов моделей, снимок по цене
(priceSnapshotId), упорядоченные по времени создания заказа в порядке
убывания. Возвращаются только обычные записи списания (reason = model usage).
Параметры запроса:
| Параметр | Тип | Обязательно | По умолчанию | Описание |
|---|---|---|---|---|
page | Integer | Нет | 1 | Номер страницы, начиная с 1. |
size | Integer | Нет | 20 | Размер страницы (пагинация по priceSnapshotId). |
startTime | LocalDateTime | No | — | Время начала, формат yyyy-MM-ddTHH:mm:ss, фильтрует по снимку
orderCreatedAt. |
endTime | LocalDateTime | No | — | Время окончания, формат yyyy-MM-ddTHH:mm:ss. |
curl --request GET \
--url "https://api.ciyuan-market.com/api/v1/usage?page=1&size=20&startTime=2026-07-01T00:00:00&endTime=2026-07-31T23:59:59" \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Обёртка ответа:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Поле | Тип | Описание |
|---|---|---|
records | UsageDetailVO[] | Записи текущей страницы. |
total | Long | Общее количество. |
current | Long | Текущая страница. |
size | Long | Размер страницы. |
pages | Long | Всего страниц. |
Поля UsageDetailVO:
| Поле | Тип | Описание |
|---|---|---|
priceSnapshotId | String | Идентификатор снимка цены. |
taskId | String | Идентификатор задачи. |
credit | BigDecimal | Списанная сумма. |
model | String | Имя модели. |
modelType | String | text / image / video. |
inputTokens | Long | Входные токены; null для image/video. |
outputTokens | Long | Выходные токены. |
totalTokens | Long | Всего токенов. |
cacheReadTokens | Long | Токены чтения из кэша. |
cacheWriteTokens | Long | Токены записи в кэш. |
imageCount | Integer | Количество изображений; задаётся для моделей изображений. |
imageResolution | String | Разрешение изображения, например 720P. |
imageRatio | String | Соотношение сторон изображения, например 1:1. |
videoResolution | String | Разрешение видео, например 1080p. |
videoRatio | String | Соотношение сторон видео, например 16:9. |
videoDurationSec | Long | Длительность видео в секундах. |
orderCreatedAt | LocalDateTime | Время создания заказа (снимок orderCreatedAt). |
creditDetails | CreditDetailItem[] | Детали заказов под этим снимком (из credit_order_t). |
Поля CreditDetailItem:
| Поле | Тип | Описание |
|---|---|---|
credit | BigDecimal | Сумма, списанная этим заказом. |
deductionSource | String | Источник списания (Balance / Monthly Package /
Resource Package). |
packageName | String | Имя пакета; null, если пакета нет. |
Соглашение о null-значениях: заполняются только поля, относящиеся к каждому
modelType; остальные равны null. Для
text заполняются поля токенов; для image —
imageCount/imageResolution/imageRatio; для video —
videoResolution/videoRatio/videoDurationSec.
Пример ответа:
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"priceSnapshotId": "snap_9f3c1a2b",
"taskId": "task_5e8a1c33",
"credit": 0.0342,
"model": "glm-5.2",
"modelType": "text",
"inputTokens": 1280,
"outputTokens": 642,
"totalTokens": 1922,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": null,
"videoRatio": null,
"videoDurationSec": null,
"orderCreatedAt": "2026-07-18T14:23:11",
"creditDetails": [
{
"credit": 0.0342,
"deductionSource": "balance",
"packageName": ""
}
]
},
{
"priceSnapshotId": "snap_a12f77c0",
"taskId": "task_c71e44a2",
"credit": 1.8000,
"model": "seedance-2.0",
"modelType": "video",
"inputTokens": null,
"outputTokens": null,
"totalTokens": null,
"cacheReadTokens": null,
"cacheWriteTokens": null,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": "1080p",
"videoRatio": "16:9",
"videoDurationSec": 8,
"orderCreatedAt": "2026-07-17T22:41:09",
"creditDetails": [
{
"credit": 1.5000,
"deductionSource": "Monthly Package",
"packageName": "基础月度套餐"
},
{
"credit": 0.3000,
"deductionSource": "Resource Package",
"packageName": "byteplus视频资源包"
}
]
}
],
"total": 128,
"current": 1,
"size": 20,
"pages": 7
}
}
GET https://api.ciyuan-market.com/api/v1/billing/transactions
Постраничный список оплаченных (status=2) транзакций пополнения текущего
пользователя, отсортированных по created_at по убыванию.
| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
page | Integer | Нет | 1 | Номер страницы. |
size | Integer | Нет | 20 | Размер страницы. |
startTime | String | Нет | — | Начальное время, yyyy-MM-dd HH:mm:ss, включительно. |
endTime | String | Нет | — | Конечное время, yyyy-MM-dd HH:mm:ss, включительно. |
curl --request GET \
--url "https://api.ciyuan-market.com/api/v1/billing/transactions?page=1&size=20&startTime=2026-07-01%2000:00:00&endTime=2026-07-31%2023:59:59" \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Обёртка ответа:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Поле | Тип | Описание |
|---|---|---|
records | TransactionVO[] | Транзакции текущей страницы. |
total | Long | Общее количество. |
current | Long | Текущая страница. |
size | Long | Размер страницы. |
pages | Long | Всего страниц. |
Поля TransactionVO:
| Поле | Тип | Описание |
|---|---|---|
orderNo | String | Номер заказа. |
thirdPartyOrderNo | String | Номер заказа третьей стороны. |
amount | BigDecimal | Сумма заказа. |
actualAmount | BigDecimal | Фактически оплаченная сумма. |
discount | BigDecimal | Сумма скидки. |
paymentMethod | String | Способ оплаты (wechat / alipay / ustd /
stripe / wallyt и т. д.). |
Поля TransactionVO:
| Поле | Тип | Описание |
|---|---|---|
serviceFeeAmount | BigDecimal | Сумма сервисного сбора. |
paymentChannel | String | Платёжная платформа. |
source | String | Источник заказа (recharge / package_purchase и т.
д.). |
packageName | String | Имя пакета (задаётся при покупке пакета; null для обычных
пополнений). |
createdAt | LocalDateTime | Время создания. |
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"orderNo": "R20260718abc123",
"thirdPartyOrderNo": "wx_pay_xxx",
"amount": 50.00,
"actualAmount": 48.50,
"discount": 1.50,
"paymentMethod": "wechat",
"serviceFeeAmount": 0.00,
"paymentChannel": "wechat",
"source": "recharge",
"packageName": null,
"createdAt": "2026-07-18T14:23:11"
}
],
"total": 28,
"current": 1,
"size": 20,
"pages": 2
}
}
Эксплуатация
Ошибки
ciyuan_market возвращает стабильные коды ошибок, чтобы приложения могли единообразно обрабатывать повторы, резервирование, проблемы с биллингом и отладку.
Совместимые с провайдерами конечные точки по возможности сохраняют форму ошибок исходного семейства API. Собственные конечные точки ciyuan_market используют объект ошибок ciyuan_market.
Соответствие HTTP-статусов и кодов ошибок
| HTTP-статус | Тип ошибки | Примеры кодов | Повтор |
|---|---|---|---|
| 400 | invalid_request_error | invalid_request, unsupported_parameter,
invalid_messages, invalid_image_url | Нет |
| 401 | authentication_error | missing_api_key, invalid_api_key | Нет |
| 402 | billing_error | insufficient_credits, payment_required,
quota_exceeded | Нет |
| 403 | permission_error | model_access_denied, endpoint_access_denied,
key_scope_denied | Нет |
| 404 | not_found_error | model_not_found, response_not_found,
task_not_found | Нет |
| 408 | timeout_error | gateway_timeout, provider_timeout | Да |
| 409 | conflict_error | idempotency_conflict, task_already_cancelled | Зависит |
| 422 | validation_error | schema_validation_failed, unsupported_modality | Нет |
| 429 | rate_limit_error | account_rpm_exceeded, account_tpm_exceeded,
provider_rate_limited | Да |
| 500 | internal_error | internal_error | Да |
| 502 | provider_error | provider_bad_gateway, provider_invalid_response | Да |
| 503 | service_unavailable | model_unavailable, provider_unavailable,
insufficient_capacity | Да |
| 504 | timeout_error | provider_timeout, gateway_timeout | Да |
Частые коды ошибок
| Код | Значение | Рекомендуемое действие |
|---|---|---|
missing_api_key | API-ключ не предоставлен. | Добавьте заголовок Authorization. |
invalid_api_key | API-ключ недействителен или отозван. | Создайте или смените API-ключ. |
model_not_found | Идентификатор модели не существует или не включён для аккаунта. | Проверьте страницу «Модели» или вызовите GET /v1/models. |
model_access_denied | API-ключ или аккаунт не имеет доступа к модели. | Включите модель или обратитесь к администратору. |
unsupported_parameter | Запрос содержит параметр, не поддерживаемый выбранной конечной точкой или моделью. | Удалите параметр или выберите совместимую модель. |
unsupported_modality | Модальность ввода или вывода не поддерживается выбранной моделью. | Выберите модель, поддерживающую эту модальность. |
account_rpm_exceeded | Превышен лимит запросов аккаунта в минуту. | Повторите с backoff или запросите большие лимиты. |
account_tpm_exceeded | Превышен лимит токенов аккаунта в минуту. | Повторите с backoff, уменьшите количество токенов или запросите большие лимиты. |
provider_rate_limited | Вышестоящий провайдер ограничил частоту запросов. | Повторите или включите резервирование. |
insufficient_credits | На аккаунте недостаточно кредитов. | Пополните кошелёк, купите пакет или повысьте тариф. |
provider_timeout | Вышестоящий провайдер не ответил вовремя. | Повторите или включите резервирование. |
model_unavailable | Модель временно недоступна. | Повторите или используйте алиас маршрутизации. |
content_policy_error | Запрос или вывод заблокированы политикой безопасности. | Измените ввод или выберите подходящий рабочий процесс. |
MCP
Руководство по MCP ciyuan_market
Оборачивает ciyuan_market (LLM-шлюз, совместимый с OpenAI) в виде MCP-сервера, чтобы ваши AI-инструменты могли напрямую вызывать эндпоинты ciyuan_market для чата, моделей, биллинга, изображений и видео.
Возможности
- 🤖 Мультиэндпоинтный чат: поддержка совместимых с OpenAI Chat Completions, Anthropic Messages и OpenAI Responses эндпоинтов
- 🖼️ Мультимодальная генерация: помимо текстового чата поддерживает асинхронные задачи генерации изображений и видео (текст-в-, изображение-в-, первый/последний кадр, референсный материал)
- 🔍 Поиск моделей и аккаунта: список доступных моделей, детали модели, баланс аккаунта, детали использования/биллинга и транзакции пополнения
- 🔑 Передача ключа через заголовок: каждый вызов считывает API-ключ из заголовка запроса, поэтому один деплой можно использовать для нескольких аккаунтов — сервер никогда не сохраняет и не кеширует ключ
Быстрый старт
Используйте его в Claude Code (рекомендуется). Добавьте -s user, чтобы
зарегистрировать его на уровне пользователя (доступен во всех ваших проектах).
Шаг 1: добавьте подключение
claude mcp add --transport http ciyuanmarket https://api.ciyuan-market.com/mcp \
--header "X-Ciyuanmarket-Api-Key: <ваш API-ключ ciyuan_market>" \
-s user
Шаг 2: проверьте подключение
claude mcp list # должно показать ✓ Connected
claude mcp get ciyuanmarket # должно показать Scope: User config (available in all your projects)
Шаг 3: начните использовать
Вы можете попросить Claude, например:
- «Используй ciyuan_market, чтобы вызвать claude-sonnet-5 и написать стихотворение про осень»
- «Покажи список моделей, доступных на моём аккаунте ciyuan_market»
- «Проверь мой баланс ciyuan_market и недавнее использование»
- «Используй ciyuan_market, чтобы сгенерировать изображение киберпанк-города ночью»
Claude автоматически вызовет подходящий MCP-инструмент и вернёт результат.
Использование с Claude Desktop
Добавьте это в раздел mcpServers:
{
"mcpServers": {
"ciyuanmarket": {
"type": "http",
"url": "https://api.ciyuan-market.com/mcp",
"headers": {
"X-Ciyuanmarket-Api-Key": "<ваш API-ключ ciyuan_market>"
}
}
}
}
Использование с Codex CLI
Рекомендуется: используйте env_http_headers, чтобы считывать ключ из
переменной окружения
Сначала экспортируйте переменную окружения в вашей оболочке:
export CIYUAN_MARKET_API_KEY=<ваш API-ключ ciyuan_market>
Затем в ~/.codex/config.toml:
[mcp_servers.ciyuanmarket]
url = "https://api.ciyuan-market.com/mcp"
env_http_headers = { "X-Ciyuanmarket-Api-Key" = "CIYUAN_MARKET_API_KEY" }
Альтернатива: используйте http_headers, чтобы записать ключ прямо в конфиг
(удобно, если вы не хотите заводить отдельную переменную окружения, но учтите, что ключ
будет храниться в конфиге в открытом виде):
[mcp_servers.ciyuanmarket]
url = "https://api.ciyuan-market.com/mcp"
http_headers = { "X-Ciyuanmarket-Api-Key" = "<ваш API-ключ ciyuan_market>" }
При добавлении через интерфейс настроек Codex:
- Тип: HTTP / Streamable HTTP
- Имя: ciyuanmarket
- URL:
https://api.ciyuan-market.com/mcp - Имя заголовка:
X-Ciyuanmarket-Api-Key - Значение заголовка: ваш API-ключ ciyuan_market
Проверка подключения
После запуска Codex CLI команда /mcp выводит список настроенных
MCP-серверов и статус их подключения — просто убедитесь, что он загрузился корректно.
Схема использования совпадает с Claude: Codex автоматически выбирает нужный
инструмент.
Если в вашем конфиге уже есть другие MCP-серверы, добавьте этот на том же уровне. После редактирования полностью закройте и снова откройте Claude Desktop.
Инструменты
Этот MCP-сервер предоставляет 14 инструментов, разделённых на пять групп:
1. Чат
1. chat_completion — Chat Completions
Отправляет один запрос диалога и возвращает полный ответ модели (без стриминга). Помимо
текста, принимает изображения для визуального понимания (модель должна поддерживать
vision) — измените content сообщения со строки на
массив блоков контента, смешивая text и image_url.
| Параметр | Обязателен | Описание |
|---|---|---|
| model | ✅ | ID модели, например «claude-sonnet-5» — сначала проверьте list_models |
| messages | ✅ | Список сообщений, каждое вида
{"role": "user"|"assistant"|"system", "content": "..."}; при
мультимодальном вводе content — массив блоков контента (см. Мультимодальный ввод
ниже) |
| temperature | ❌ | Температура выборки — выше значит более случайно |
| max_tokens | ❌ | Максимальное число генерируемых токенов |
Мультимодальный ввод (text / image / video)
Ввод изображения (URL):
{"role": "user", "content": [
{"type": "text", "text": "Что на этом изображении?"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]}
Ввод изображения (Base64):
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<BASE64_STRING>"}}
Поддерживаемые форматы: PNG, JPEG, GIF (только первый кадр), WebP. Одно изображение до 20MB.
Примечание: Base64-кодирование больших изображений даёт очень длинные строки и может завершиться ошибкой из-за слишком большого тела запроса; предпочтительнее передавать изображения по URL.
Параметр detail (необязательный, задаётся в объекте image_url) управляет
точностью обработки изображения: "auto" (по умолчанию — модель решает по
размеру) / "low" (превью 512x512, быстро и дёшево, для простой
классификации) / "high" (полное разрешение, для мелкого текста / деталей).
В массиве content одного сообщения можно разместить несколько блоков image_url, чтобы
передать несколько изображений.
Video input (URL):
{"role": "user", "content": [
{"type": "text", "text": "Опишите, что происходит в этом видео."},
{"type": "video_url", "video_url": {"url": "https://example.com/video.mp4"}}
]}
Video input (Base64):
{"type": "video_url", "video_url": {"url": "data:video/mp4;base64,<BASE64_STRING>"}}
Модели, поддерживающие ввод видео на ciyuan_market, включают отдельные модели серий Qwen, Doubao (dola-seed), Kimi, MiniMax — проверьте input_modalities, возвращаемый list_models. Официальный стандарт Chat Completions OpenAI не поддерживает видео нативно, но шлюз ciyuan_market поддерживает через
{"type": "video_url", "video_url": {"url": "..."}}
формат расширения. Этот формат совместим с форматом video_url, используемым OpenRouter, NVIDIA NIM, vLLM и другими платформами.
2. create_message — совместим с Anthropic Messages
Вызывает совместимый интерфейс Anthropic Messages (без стриминга). Блоки контента поддерживают text, image, tool_use, tool_result, thinking, redacted_thinking. Изображения передаются через блоки контента
{"type": "image", "source": {...}}
.
| Параметр | Обязателен | Описание |
|---|---|---|
| model | ✅ | ID модели, например «claude-sonnet-4.6» |
| messages | ✅ | Список сообщений; content может быть строкой или массивом блоков контента (text/image/tool_use/tool_result/thinking и т.д.) |
| max_tokens | ✅ | Максимальное число токенов на выходе |
| system | ❌ | Системный промпт — строка или
[{"type": "text", "text": "..."}] |
| temperature / top_p / top_k | ❌ | Параметры выборки |
| tools | ❌ | Определения инструментов, каждое в форме
{"name", "description", "input_schema", ...} |
| tool_choice | ❌ | Стратегия выбора инструмента |
| thinking | ❌ | Конфигурация расширенного рассуждения |
| stop_sequences | ❌ | Пользовательские стоп-последовательности |
| metadata | ❌ | Дополнительные метаданные |
| anthropic_beta | ❌ | Идентификатор бета-функции для заголовка anthropic-beta |
Мультимодальный ввод (text / image / video)
Ввод изображения поддерживает три типа source:
1. Base64-кодирование (внимание: поле data — чистая Base64-строка,
без префикса data:); media_type поддерживает
image/jpeg, image/png, image/gif, image/webp:
{"type": "image", "source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "<BASE64_STRING>"
}}
2. URL-ссылка:
{"type": "image", "source": {
"type": "url",
"url": "https://example.com/image.jpg"
}}
3. File ID (сначала загрузите изображение через Files API с
purpose="vision", чтобы получить file_id):
{"type": "image", "source": {
"type": "file",
"file_id": "<file_id>"
}}
В массиве content одного сообщения можно разместить несколько блоков image, чтобы передать несколько изображений.
Примечание: Base64-кодирование больших изображений даёт очень длинные строки и может завершиться ошибкой из-за слишком большого тела запроса; предпочтительнее передавать изображения по URL.
Ввод видео: API Anthropic Messages не поддерживает видеофайлы нативно. Для понимания видео сначала извлеките ключевые кадры через ffmpeg или аналоги, затем передайте каждый кадр как блок контента image. Некоторые совместимые шлюзы могут расширять поддержку до
{"type": "video", "source": {...}}
и подобных — см. документацию вашего шлюза. For models supporting video input on ciyuan_market (check input_modalities via list_models), use chat_completion or create_response for native video support.
3. create_response — совместим с OpenAI Responses
Использует input вместо messages,
instructions вместо системного сообщения и text.format вместо
response_format. Помимо текста, принимает изображения для визуального
понимания (модель должна поддерживать vision) — задайте input как массив
объектов-сообщений, чей content — массив блоков контента, смешивающий текст и
изображения.
| Параметр | Обязателен | Описание |
|---|---|---|
| model | ✅ | ID модели, например «glm-5.2» |
| input | ✅ | Простая строка (как одно пользовательское сообщение) или массив объектов-сообщений (используется для мультимодального ввода, см. ниже) |
| instructions | ❌ | Системный промпт |
| max_output_tokens | ❌ | Максимальное число токенов на выходе |
| temperature / top_p | ❌ | Параметры выборки |
| tools | ❌ | Определения инструментов, форма верхнего уровня
{"type", "name", "description", "parameters"} |
| tool_choice | ❌ | "auto" / "none" / "required" или {"type", "name"} |
| text | ❌ | Конфигурация формата вывода, например
{"format": {"type": "text" | "json_object" | "json_schema", ...}} |
| previous_response_id | ❌ | ID предыдущего ответа для многошаговых диалогов |
| parallel_tool_calls | ❌ | Разрешить ли параллельные вызовы инструментов |
| metadata | ❌ | Дополнительные метаданные |
Мультимодальный ввод (text / image / video)
Примечание: Responses API использует типы блоков контента input_text /
input_image / input_video (не text / image_url / video_url как
в Chat Completions), а image_url / video_url — bare-строка, не
вложенный объект.
Ввод изображения (URL):
[{"role": "user", "content": [
{"type": "input_text", "text": "Что на этом изображении?"},
{"type": "input_image", "image_url": "https://example.com/image.jpg"}
]}]
Ввод изображения (Base64):
{"type": "input_image", "image_url": "data:image/jpeg;base64,<BASE64_STRING>"}
Поддерживаемые форматы: PNG, JPEG, GIF (только первый кадр), WebP. Одно изображение до 20MB.
Примечание: Base64-кодирование больших изображений даёт очень длинные строки и может завершиться ошибкой из-за слишком большого тела запроса; предпочтительнее передавать изображения по URL.
Ввод изображения (File ID):
{"type": "input_image", "file_id": "<file_id>"}
— file_id получается загрузкой изображения через Files API с
purpose="vision".
Параметр detail (необязательный, в объекте input_image) управляет
точностью обработки: "auto" (по умолчанию) / "low" (превью
512x512, быстро и дёшево) / "high" (полное разрешение, для мелкого текста /
деталей) / "original" (оригинальное разрешение). В массиве content одного
сообщения можно разместить несколько блоков input_image для нескольких изображений.
Video input (URL):
[{"role": "user", "content": [
{"type": "input_text", "text": "Опишите, что происходит в этом видео."},
{"type": "input_video", "video_url": "https://example.com/video.mp4"}
]}]
Video input (Base64):
{"type": "input_video", "video_url": "data:video/mp4;base64,<BASE64_STRING>"}
; Video input (File ID):
{"type": "input_video", "file_id": "<file_id>"}
. Модели, поддерживающие ввод видео на ciyuan_market, включают отдельные модели серий Qwen, Doubao (dola-seed), Kimi, MiniMax — проверьте input_modalities, возвращаемый list_models. Официальный стандарт Responses API OpenAI не поддерживает видео нативно, но шлюз ciyuan_market поддерживает через
{"type": "input_video", "video_url": "..."}
формат расширения. Этот формат совместим с форматом input_video, используемым BytePlus/Volcengine и другими платформами.
2. Модели и аккаунт
4. list_models — список доступных моделей
Возвращает модели, доступные текущему аккаунту, с метаданными о вендоре, модальности,
возможностях и ценах. Без параметров. Каждый элемент списка содержит ценовые тарифы
price_tiers — действующую цену биллинга для вызывающего, совпадающую с
реальным списанием (см. описание поля ценовых тарифов)
(only some newer models).
5. get_model — получить детали одной модели
| Параметр | Обязателен | Описание |
|---|---|---|
| model | ✅ | ID модели, например «gpt-5.5» — при отсутствии вернёт понятную ошибку |
Вывод содержит ценовые тарифы price_tiers (см.
описание поля ценовых тарифов); при отсутствии модели
возвращает 404 без ценовых полей.
6. get_balance — проверить баланс аккаунта
Возвращает текущее использование и баланс аккаунта. Без параметров.
3. Биллинг
7. list_usage — детали использования моделей/биллинга
Постраничные детали биллинга по использованию моделей, отсортированные по времени создания заказа по убыванию. Только обычные списания за использование — без пополнений и корректировок.
| Параметр | Обязателен | Описание |
|---|---|---|
| page | ❌ | Номер страницы, начиная с 1, по умолчанию 1 |
| size | ❌ | Размер страницы, по умолчанию 20 |
| start_time | ❌ | Время начала, формат «yyyy-MM-ddTHH:mm:ss» (например, «2026-07-01T00:00:00») |
| end_time | ❌ | Время окончания, тот же формат |
8. list_transactions — транзакции пополнений/пакетов
Постраничные оплаченные транзакции пополнения / покупки пакетов, отсортированные по времени создания по убыванию.
| Параметр | Обязателен | Описание |
|---|---|---|
| page | ❌ | Номер страницы, начиная с 1, по умолчанию 1 |
| size | ❌ | Размер страницы, по умолчанию 20 |
| start_time | ❌ | Время начала, формат «yyyy-MM-dd HH:mm:ss» (обратите внимание: между датой и временем пробел, а не «T») |
| end_time | ❌ | Время окончания, тот же формат |
4. Генерация изображений
9. list_image_models — список моделей изображений
Возвращает поддерживаемые модели генерации изображений с разрешением, соотношением
сторон, максимальным числом изображений (maxCount) и максимальным числом референсных
изображений (fileMax). Без параметров. Проверяйте это перед генерацией изображений —
можно передавать только опубликованные здесь значения. Каждый элемент списка содержит
ценовые тарифы priceTiers (см.
описание поля ценовых тарифов).
10. create_image_generation — отправить задачу генерации изображения
Отправляет асинхронно и сразу возвращает taskId; расходует кредиты аккаунта.
| Параметр | Обязателен | Описание |
|---|---|---|
| text | ✅ | Промпт для генерации изображения |
| model | ✅ | Имя модели из id, возвращённого list_image_models |
| count | ❌ | Количество генерируемых изображений |
| resolution | ❌ | Разрешение из resolutions в list_image_models |
| ratio | ❌ | Соотношение сторон из ratios в list_image_models |
| image_urls | ❌ | URL референсных изображений (изображение-в-изображение), количество ограничено fileMax этой модели |
| callback_url | ❌ | Webhook, вызываемый по завершении; при отсутствии — опрашивайте вручную |
11. get_image_generation — опросить задачу генерации изображения
| Параметр | Обязателен | Описание |
|---|---|---|
| task_id | ✅ | taskId, возвращённый create_image_generation |
Возвращает: status — pending / success / failed; images — JSON-массив строк с URL изображений; text содержит дополнительный вывод модели (например, мультимодальный вывод Gemini).
5. Генерация видео
12. list_video_models — список моделей видео
Возвращает поддерживаемые модели генерации видео с allowedVideoTypes, диапазоном
длительности (videoDurationMin/Max), разрешением, соотношением сторон и лимитом
референсных материалов (fileMax). Без параметров. Проверяйте это перед генерацией видео.
Каждый элемент списка содержит ценовые тарифы priceTiers (см.
описание поля ценовых тарифов).
13. create_video_generation — отправить задачу генерации видео
Отправляет асинхронно и сразу возвращает taskId; расходует кредиты аккаунта.
| Параметр | Обязателен | Описание |
|---|---|---|
| text | ✅ | Промпт для генерации видео; при video_type=5 референсные материалы обозначаются «@Image N»/«@Video N»/«@Audio N» |
| model | ✅ | Имя модели из id, возвращённого list_video_models |
| video_type | ✅ | Код режима генерации (1-5, см. ниже) — допустимы только значения из allowedVideoTypes этой модели |
| image_urls | ❌ | URL изображений; смысл зависит от video_type |
| video_urls | ❌ | URL видеоматериалов, только для video_type=5 |
| audio_urls | ❌ | URL аудиоматериалов, только для video_type=5 |
| resolution / ratio | ❌ | Разрешение / соотношение сторон из list_video_models |
| duration | ❌ | Длительность видео в секундах, должна укладываться в videoDurationMin/Max |
| callback_url | ❌ | Webhook, вызываемый по завершении; при отсутствии — опрашивайте вручную |
Значения video_type:
| Значение | Режим | Требуемый материал |
|---|---|---|
| 1 | Текст-в-видео | Материал не требуется |
| 2 | Изображение-в-видео (первый кадр) | image_urls содержит один начальный кадр |
| 3 | Изображение-в-видео (первый/последний кадр) | image_urls содержит [первый кадр, последний кадр] в этом порядке |
| 4 | Изображение-в-видео (референс) | image_urls содержит одно или несколько референсных изображений стиля/содержания |
| 5 | Все референсы | Смесь image_urls/video_urls/audio_urls, на которые ссылаются по позиции в text |
14. get_video_generation — опросить задачу генерации видео
| Параметр | Обязателен | Описание |
|---|---|---|
| task_id | ✅ | taskId, возвращённый create_video_generation |
Описание поля ценовых тарифов
Вывод этих 4 инструментов запроса моделей — list_models,
get_model, list_image_models, list_video_models —
возвращает действующую цену биллинга вызывающего (пользователя API
Key), полностью совпадающую с реальным списанием, и включает
все ценовые тарифы модели.
Различие в именовании: list_models / get_model используют
OpenAI snake_case (price_tiers); list_image_models /
list_video_models используют camelCase (priceTiers). Структура
одинакова.
price_tiers / priceTiers — массив; каждый элемент это ценовой
тариф:
| Поле | Тип | Описание |
|---|---|---|
region | string | Регион уровней V2 текстовых моделей, напр. GLOBAL /
NON_GLOBAL / us-central1. Null для моделей
изображений/видео |
bandMin | long | Нижняя граница диапазона input token текстовой модели (включительно); null = без границ |
bandMax | long | Верхняя граница диапазона input token текстовой модели (включительно); null = без границ |
resolution | string | Разрешение изображения/видео, напр. 1080p / 4K. Null
для текстовых моделей |
clarity | string | Уровень чёткости |
unit | string | Единица биллинга: token (текст) / image (изображение)
/ video (видео) |
quantity | integer | Количество единиц (напр. на 1000 token, на 1 изображение) |
description | string | Описание цены |
inputPrice | decimal | Действующая входная цена вызывающего |
outputPrice | decimal | Действующая выходная цена вызывающего |
cachePrice | decimal | Цена кэша (универсальные модели, старая формула биллинга) |
cacheReadPrice | decimal | Цена чтения кэша (только Bedrock Claude) |
cacheWritePrice | decimal | Цена записи кэша (только Bedrock Claude) |
ratio | decimal | Множитель биллинга. 1 для режима FIXED;
пользовательский/групповой множитель для режима RATIO |
mode | string | Режим цены: RATIO / FIXED |
planId | string | id сработавшего ценового плана; может быть null |
Три типа моделей имеют одну структуру; различаются только поля описания, неприменимые поля равны null:
| Тип модели | unit | Действующие поля описания |
|---|---|---|
| Текст | token | region / bandMin / bandMax |
| Изображение | image | resolution / clarity |
| Видео | video | resolution / clarity |
Смысл цены: возвращаемые inputPrice / outputPrice /
cacheReadPrice / cacheWritePrice и т.д. — это итоговые цены
биллинга для текущего пользователя API Key, вычисленные через ценовую
цепочку (chain) → guidance → базовую цену, и совпадают с реальным списанием. Цена,
которую видит вызывающий, зависит от его ценовой цепочки (reseller / distributor /
предприятие / пользовательская настройка).
Реальное списание = объём ÷ quantity × цена × ratio. При
посекундном биллинге видео: реальное списание = duration ×
outputPrice × ratio.
Граничные случаи и обработка ошибок (read-only эндпоинт не возвращает 500 из-за конфигурации цены):
| Сценарий | Поведение |
|---|---|
| Одиночный тариф не разобран (ценовая политика отказала в доступе, нет конфигурации) | Пропустить тариф, записать warn-лог, продолжить разбор остальных |
| Все тарифы модели не разобраны | Пустой массив []; модель возвращается нормально |
| У модели нет конфигурации цены | Пустой массив [] |
| Разбор цены выбросил неперехваченное исключение | Перехватывается целиком, возвращается пустой массив; эндпоинт остаётся 200 |
Пример ответа (list_models, текстовая модель):
{
"object": "list",
"data": [
{
"id": "gpt-4o",
"object": "model",
"display_name": "gpt-4o",
"context_length": 128000,
"description": "...",
"price_tiers": [
{
"region": "GLOBAL",
"bandMin": null,
"bandMax": null,
"resolution": null,
"clarity": null,
"unit": "token",
"quantity": 1000,
"description": "за 1K token",
"inputPrice": 0.0025,
"outputPrice": 0.01,
"cachePrice": 0.00125,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Пример ответа (list_image_models, модель изображений;
priceTiers структура та же, unit равен image):
{
"object": "list",
"data": [
{
"id": "dall-e-3",
"object": "image_model",
"displayName": "dall-e-3",
"resolutions": ["1024x1024", "1792x1024", "1024x1792"],
"priceTiers": [
{
"region": null,
"bandMin": null,
"bandMax": null,
"resolution": "1024x1024",
"clarity": "standard",
"unit": "image",
"quantity": 1,
"description": "за изображение",
"inputPrice": 0,
"outputPrice": 0.04,
"cachePrice": 0,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Примеры
Пример 1: обычный запрос чата
Спросите: «Используй ciyuan_market, чтобы вызвать claude-sonnet-5 и спросить, что такое GIL в Python»
AI вызовет chat_completion с параметрами:
{
"model": "claude-sonnet-5",
"messages": [{"role": "user", "content": "What is Python's GIL?"}]
}
Пример 2: использование инструментов через эндпоинт Anthropic Messages
Спросите: «Используй эндпоинт Messages ciyuan_market и позволь модели решить, нужно ли проверять погоду»
AI вызовет create_message, передав определение tools и
tool_choice; в ответе будет блок контента tool_use.
Пример 3: список доступных моделей
Спросите: «Покажи список моделей на моём аккаунте ciyuan_market»
AI вызовет list_models, вернув ID, вендоров, модальности, цены и другую
информацию по каждой доступной модели.
Пример 4: проверка баланса и использования
Спросите: «Проверь моё использование ciyuan_market за этот месяц»
AI вызовет get_balance для баланса, затем list_usage (с
start_time, ограниченным этим месяцем) для разбивки использования.
Пример 5: генерация изображения
Спросите: «Используй ciyuan_market, чтобы сгенерировать изображение киберпанк-города ночью»
AI сначала вызовет list_image_models, чтобы проверить спецификации, затем
create_image_generation, чтобы получить taskId, затем опросит
get_image_generation для получения URL изображения.
Пример 6: текст-в-видео
Спросите: «Используй ciyuan_market, чтобы сгенерировать 5-секундное видео космической туманности»
AI сначала вызовет list_video_models, чтобы проверить спецификации, затем
create_video_generation (video_type=1,
duration=5), и после получения taskId опросит
get_video_generation.
ЧАВО
Вызов инструмента завершается ошибкой «missing ciyuan_market API Key»
- Вы выполнили
claude mcp addбез--header, либо ключ указан неверно - Если вы редактируете JSON-конфиг напрямую, имя поля в
headersуказано неверно (должно бытьX-Ciyuanmarket-Api-Key) - Запуск локально без установленной переменной окружения
CIYUAN_MARKET_API_KEY
Вызов инструмента завершается ошибкой «ciyuan_market returned 401 unauthorized»
Сам API-ключ неверен или истёк — перегенерируйте его в консоли ciyuan_market.
Claude не вызывает инструменты ciyuan_market — что делать?
- Убедитесь, что подключение показывает ✓ Connected через
claude mcp list - Проверьте статус подключения:
claude mcp get ciyuanmarket - Попробуйте сформулировать явно: «Используй инструмент
chat_completionciyuan_market, чтобы вызватьclaude-sonnet-5…»
Генерация изображения/видео бесконечно висит в статусе pending
- Опрашивайте задачи изображений через
get_image_generation, а задачи видео черезget_video_generation— обратите внимание, что у выполняющейся задачи видео статус «running», а не «pending» - Генерация занимает время, обычно от нескольких до десятков секунд, для видео — дольше
- Если вы передали
callback_url, задача сама вызовет обратный вызов по завершении — опрос не требуется
Ошибки list_image_models / list_video_models
Ни один из этих инструментов сам по себе не расходует кредиты — ошибка обычно указывает
на проблему с ключом или сетью. Сначала убедитесь, что list_models работает
нормально.
Примечания
- Имя заголовка:MCP передаёт ключ через
X-Ciyuanmarket-Api-Key. - Расход кредитов:
chat_completion/create_message/create_response/create_image_generation/create_video_generation— все они расходуют кредиты аккаунта; проверьтеget_balanceзаранее, если хотите знать баланс до вызова. - Проверяйте спецификации перед генерацией:Параметры генерации
изображений/видео, такие как model, resolution, ratio, count, duration и video_type,
должны использовать только значения, опубликованные
list_image_models/list_video_models, иначе вызов завершится ошибкой. - Без потоковой передачи:Ни один из трёх эндпоинтов чата не поддерживает потоковую передачу — каждый возвращает полный результат сразу.
- Stateless-дизайн:Каждый запрос независим, сессии не сохраняются; для
многошаговых диалогов используйте
previous_response_idвcreate_responseили самостоятельно поддерживайте историю вmessages.
Поддержка
Получите помощь по ciyuan_market
Найдите ответы на распространённые вопросы об API, биллинге, маршрутизации и интеграции. Для производственных инцидентов приложите идентификатор запроса, метку API-ключа, конечную точку, модель и временную метку, чтобы команда могла быстро отследить запрос.
FAQ
Нажмите на вопрос, чтобы развернуть ответ.
Контакты
Выберите подходящий ящик для обращения.
Для инцидентов, ограничений частоты, вопросов по биллингу, производственных проблем с маршрутизацией, миграции SDK, совместимости провайдеров, вопросов проектирования конечных точек, корпоративных тарифов, гарантированного использования или требований к пользовательской маршрутизации провайдеров.












