Documentação do ciyuan_market
Início rápido
O ciyuan_market oferece às equipes de produção uma API estável para acesso a modelos, roteamento, fallback, rastreamento de uso e cobrança baseada em créditos. O fornecimento de tokens LLM é proveniente de contas originais de provedores confiáveis em nuvem corporativa, com proteção de privacidade, alta estabilidade e rastreabilidade de solicitações integradas ao gateway.
https://api.ciyuan-market.com/apihttps://api.ciyuan-market.com/api/v1https://api.ciyuan-market.com/api/v1Authorization: Bearer <key>Criar uma chave API
Crie uma chave API do ciyuan_market no console. Mantenha a chave no seu servidor e nunca a exponha no código do navegador ou do cliente móvel.
Estratégia de chave recomendada:
| Tipo de chave | Uso recomendado |
|---|---|
| Chave de desenvolvimento | Desenvolvimento local, homologação, testes e protótipos. |
| Chave de produção | Apenas cargas de trabalho de produção no backend. |
| Chave de integração | Chave dedicada para ferramentas como Cursor, Claude Code, Codex, Hermes ou OpenClaw. |
| Chave de cliente / tenant | Isolamento opcional de chave para clientes corporativos, tráfego de tenant ou unidades de negócio. |
Rotacione as chaves quando o acesso da equipe mudar. Revogue as chaves que não são mais usadas.
Aponte seu SDK para o ciyuan_market
A maioria dos clientes compatíveis com OpenAI só precisa de uma nova URL base e chave API.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CIYUAN_MARKET_API_KEY,
baseURL: "https://api.ciyuan-market.com/api/v1"
});
Enviar uma conclusão de chat
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." }
]
}'
Verificar uso e saldo
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/billing/balance \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Descoberta de modelos
Use a página de Modelos ou a API de Modelos para inspecionar os modelos de texto disponíveis. Os metadados do modelo incluem fornecedor, provedor de serviço, modalidade, comprimento de contexto, famílias de API suportadas, capacidades suportadas, disponibilidade, limites no nível da conta e preço em créditos.
Endpoint: GET /v1/models
Objetivo: Listar modelos disponíveis para a conta atual.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/models \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Matriz de capacidades
| Capacidade | Descrição | Comumente usado por |
|---|---|---|
streaming | Suporta streaming de eventos enviados pelo servidor (SSE). | Apps de chat, agentes de programação, UX em tempo real. |
tool_calling | Suporta chamada de ferramentas ou funções. | Agentes, automação de fluxos de trabalho, assistentes de programação. |
structured_outputs | Suporta saídas com restrição de esquema ou JSON. | Extração de dados, automação de fluxos de trabalho, apps corporativos. |
json_mode | Pode retornar saída formatada em JSON. | Respostas estruturadas leves. |
vision | Aceita entrada de imagem. | Chat multimodal, análise de UI, capturas de tela de documentos. |
prompt_caching | Suporta entrada em cache ou reutilização de contexto. | Agentes de contexto longo, prompts de sistema repetidos. |
reasoning | Suporta controles explícitos de raciocínio quando disponíveis. | Planejamento complexo, programação, fluxos de análise. |
logprobs | Suporta saída de probabilidade de tokens. | Avaliação, classificação, fluxos avançados de NLP. |
Matriz de compatibilidade de famílias de API
| Família de API | Texto | Entrada de visão | Chamada de ferramentas | Saída estruturada | Streaming | Observações |
|---|---|---|---|---|---|---|
| OpenAI Chat Completions | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Melhor padrão para agentes e SDKs compatíveis com OpenAI. |
| OpenAI Responses | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Recomendado para fluxos de trabalho de agentes mais recentes no estilo OpenAI. |
| Anthropic Messages | Sim | Depende do modelo | Depende do modelo | Depende do modelo | Sim | Melhor para clientes compatíveis com Claude e Claude Code. |
| Geração de imagem ciyuan_market | Não | Depende do modelo | Não | Não | Não | Usa polling assíncrono de tarefas ou webhook. |
| Geração de vídeo ciyuan_market | Não | Depende do modelo | Não | Não | Não | Usa polling assíncrono de tarefas ou webhook. |
Autenticação
Toda solicitação de API usa um token bearer. Armazene as chaves em variáveis de ambiente do lado do servidor, rotacione-as quando o acesso da equipe mudar e registre os IDs de solicitação para depuração.
| Cabeçalho | Valor | Observações |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Obrigatório para toda solicitação. |
Content-Type | application/json | Obrigatório para corpos de solicitação JSON. |
Recomendações de segurança de chaves
- Mantenha as chaves API no servidor. Não exponha as chaves no código do navegador ou do cliente móvel.
- Use separate keys for development, staging, production, and third-party integrations.
- Defina o escopo das chaves por ambiente, serviço, cliente ou tenant quando disponível.
- Rotate keys after employee departures, vendor access changes, or suspected leakage.
- Armazene as chaves em gerenciadores de segredos ou variáveis de ambiente, não no código-fonte.
Agentes de programação
O ciyuan_market funciona com agentes de programação e ferramentas de desenvolvimento
de IA que suportam endpoints de API compatíveis com OpenAI ou Anthropic. Use aliases de
roteamento como mwf/coding-auto para que o ciyuan_market possa rotear para
o melhor modelo de programação disponível sem exigir que os desenvolvedores alterem a
configuração da ferramenta.
Configuração genérica compatível com OpenAI
Use esta configuração para Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, agentes baseados em LangChain, agentes baseados em LlamaIndex e runtimes de agentes personalizados compatíveis com 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"
Configuração genérica compatível com Anthropic
Use esta configuração para clientes compatíveis com Claude e ferramentas que esperam o formato 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"
Modelos de agente recomendados
| Caso de uso | Alias recomendado | Requisitos |
|---|---|---|
| Programação geral | mwf/coding-auto | Chamada de ferramentas, streaming, forte capacidade de programação. |
| Chat de programação rápido | mwf/coding-fast | Baixa latência e streaming. |
| Análise de repositório grande | mwf/coding-long | Contexto longo e saída estável. |
| Assistente de programação sensível a custos | mwf/low-cost | Preço menor e qualidade de programação aceitável. |
| Captura de tela de UI / programação com visão | mwf/vision-chat | Entrada de visão e saída de texto. |
Guia rápido do Cursor
Use o endpoint compatível com OpenAI.
Base URL: https://api.ciyuan-market.com/api/v1
API Key: CIYUAN_MARKET_API_KEY
Model: mwf/coding-auto
Passos recomendados:
- Abra as configurações do Cursor.
- Adicione ou ative a configuração de chave API compatível com OpenAI.
- Defina a substituição da URL base do OpenAI para
https://api.ciyuan-market.com/api/v1. - Adicione um modelo personalizado como
mwf/coding-auto,mwf/coding-fastoumwf/coding-long. - Use um modelo que suporte streaming e chamada de ferramentas para o melhor comportamento do agente.
Solução de problemas:
| Problema | Correção sugerida |
|---|---|
| Modelo não exibido | Adicione o nome do modelo manualmente como um modelo personalizado. |
| Falha na chamada de ferramentas | Use um modelo com tool_calling: true na página de Modelos. |
| Streaming interrompido | Repita com backoff ou use um alias de roteamento com fallback. |
| Erro 401 | Verifique a chave API e a URL base. |
| Erro 404 de modelo | Confirme se o modelo está ativado para a conta. |
Guia rápido do Claude Code
Use o endpoint do gateway compatível com 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"
O ciyuan_market suporta este caminho compatível com Anthropic para compatibilidade com Claude Code e SDK Anthropic:
POST /api/v1/messages
Requisitos recomendados:
| Requisito | Motivo |
|---|---|
| Formato de solicitação compatível com Anthropic Messages | O Claude Code espera mensagens no estilo Anthropic. |
| Suporte a streaming | O Claude Code depende da UX de streaming. |
| Suporte a chamada de ferramentas | Obrigatório para fluxos de trabalho de programação agentic. |
| Contexto longo | Útil para tarefas no nível de repositório. |
| Fallback estável | Útil para sessões de programação demoradas. |
Guia rápido do Codex
Use o ciyuan_market como um provedor de modelo personalizado compatível com OpenAI.
Exemplo de configuração do provedor:
[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"
Variável de ambiente:
export CIYUAN_MARKET_API_KEY="br_xxx"
Modelos recomendados:
| Modelo | Caso de uso |
|---|---|
mwf/coding-auto | Modelo de agente de programação padrão. |
mwf/coding-long | Contexto de repositório grande. |
mwf/coding-fast | Iteração rápida e pequenas alterações. |
Solução de problemas:
| Problema | Correção sugerida |
|---|---|
| Erro de autenticação | Confirme que env_key aponta para CIYUAN_MARKET_API_KEY. |
| Modelo não encontrado | Adicione o alias no Console do ciyuan_market ou use um ID de modelo direto. |
| Erro da API Responses | Use wire_api = "responses" apenas para modelos e
endpoints que suportam Responses. |
| Modelo apenas para Chat Completions | Mude para uma API wire compatível com chat se o cliente suportar. |
Guia rápido do Hermes
Use o endpoint compatível com OpenAI, a menos que sua implantação do Hermes esteja configurada para outro protocolo.
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"
Política de modelo recomendada:
| Carga de trabalho do Hermes | Modelo |
|---|---|
| Geração de código geral | mwf/coding-auto |
| Execução de tarefas de baixa latência | mwf/coding-fast |
| Verificação de repositório de contexto longo | mwf/coding-long |
| Tarefas em segundo plano sensíveis a custos | mwf/low-cost |
Guia rápido do OpenClaw
Use o endpoint compatível com OpenAI para a configuração de runtime de agente no estilo 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"
Se o OpenClaw suportar múltiplos provedores, configure o ciyuan_market como um provedor compatível com OpenAI e use aliases de roteamento do ciyuan_market para seleção de modelo.
{
"provider": "openai-compatible",
"base_url": "https://api.ciyuan-market.com/api/v1",
"api_key_env": "CIYUAN_MARKET_API_KEY",
"model": "mwf/coding-auto"
}
Lista de verificação de compatibilidade de agentes
| Capacidade | Obrigatório para |
|---|---|
| Streaming | Boa UX de terminal/editor. |
| Chamada de ferramentas | Programação agentic, edições de arquivo, execução de comandos. |
| Contexto longo | Repositórios grandes e alterações em múltiplos arquivos. |
| Structured outputs | Planejamento, decomposição de tarefas, fluxos automatizados. |
| Vision input | Análise de captura de tela de UI e fluxos de design para código. |
| Fallback | Estabilidade de produção e tarefas demoradas. |
Uso do console
O Console do ciyuan_market é o plano de controle operacional para acesso à API, disponibilidade de modelos, políticas de roteamento, visibilidade de uso e administração de cobrança. Ele oferece aos administradores da conta uma visão centralizada de chaves, modelos, solicitações, créditos e controles no nível da conta para tráfego de modelos em produção.
Gerenciamento de chaves API
Crie, rotacione, revogue e rotule chaves API no console. Use chaves separadas para desenvolvimento, homologação, produção e serviços individuais para que o uso possa ser auditado e isolado por ambiente ou aplicação.
| Prática | Descrição |
|---|---|
| Ambientes separados | Use chaves API diferentes para tráfego de desenvolvimento, homologação e produção. |
| Use rótulos descritivos | Rotule as chaves por aplicação, serviço, ambiente ou integração. |
| Rotacione regularmente | Rotacione as chaves quando o acesso mudar ou as credenciais podem ter sido expostas. |
| Evite exposição no lado do cliente | Mantenha as chaves API apenas em sistemas do lado do servidor. Não exponha as chaves no código do navegador ou do cliente móvel. |
| Monitore o uso da chave | Revise o volume de solicitações, consumo de créditos e padrões de erro por chave. |
Lista de modelos
Use a página de Modelos para revisar os modelos disponíveis para a conta. Cada entrada de modelo pode incluir fornecedor, provedor de serviço, modalidade, famílias de API suportadas, comprimento de contexto, sinalizadores de capacidade, status de disponibilidade e informações de preço.
| Filtro | Objetivo |
|---|---|
| Vendor | Filtre por fornecedor do modelo como OpenAI, Anthropic, Google, Qwen, DeepSeek ou outros provedores. |
| Provedor | Filtre por provedor de serviço ou provedor de nuvem. |
| Modality | Filtre por suporte a texto, imagem, vídeo, embedding, áudio ou multimodal. |
| Capability | Filtre por suporte a streaming, chamada de ferramentas, saídas estruturadas, visão, cache de prompt ou raciocínio. |
| Availability | Identifique modelos que estão disponíveis para a conta no momento. |
Para aplicações em produção, verifique as capacidades do modelo antes de ativar o tráfego. Alguns parâmetros e recursos dependem do modelo e podem não ser suportados em todas as famílias de API.
Uso e logs
A visualização de Uso e Logs fornece visibilidade operacional do tráfego da API. As equipes podem inspecionar o volume de solicitações, modelos selecionados, destinos de roteamento resolvidos, consumo de créditos, latência, códigos de erro e IDs de solicitação.
- Solucione falhas em solicitações.
- Identifique cargas de trabalho de alto custo.
- Compare o uso de modelos entre aplicações e ambientes.
- Valide o comportamento de roteamento e fallback.
- Investigue problemas de latência ou disponibilidade do provedor.
- Forneça IDs de solicitação ao contatar o suporte.
Cada resposta da API inclui ou expõe um ID de solicitação do ciyuan_market. Armazene este ID nos logs da sua aplicação para tornar a depuração de produção e a escalonamento de suporte mais eficientes.
Fallback
O Fallback é o mecanismo de resiliência do ciyuan_market. Quando o modelo principal ou a política de roteamento falha, o sistema alterna automaticamente para um modelo de backup para continuar processando a solicitação. Isso mantém sua aplicação responsiva e minimiza o risco de interrupção do serviço.
O Fallback atua como uma rede de segurança, mantendo sua aplicação funcionando sem problemas, mesmo quando ocorre uma falha de modelo, limite de cota ou flutuação de rede.
Por que o fallback é importante
Em produção, os serviços de modelo podem enfrentar vários problemas imprevisíveis:
- Falha no serviço do modelo: a API upstream fica temporariamente indisponível ou atinge o tempo limite.
- Flutuação de desempenho: alta carga do modelo leva a respostas lentas ou com falha.
- Falha de roteamento: todos os modelos candidatos selecionados pelo roteamento inteligente ficam indisponíveis.
O Fallback mantém sua aplicação disponível fornecendo um caminho de backup confiável.
Principais vantagens
| Vantagem | Descrição |
|---|---|
| High availability | O failover automático mantém o serviço em execução e reduz o impacto das interrupções. |
| Transparent switching | O sistema alterna os modelos automaticamente — não são necessárias alterações no código da aplicação. |
| Flexible configuration | Suporta configuração tanto por solicitação quanto no nível da conta para diferentes casos de uso. |
| Cost optimization | Escolha um modelo mais econômico como fallback para controlar custos de emergência. |
| Centralized management | Configure uma vez no nível da conta e será aplicado automaticamente a toda solicitação. |
Configuração de modelo de fallback global
O ciyuan_market suporta a definição de um modelo de fallback global no backend do console. Todas as solicitações usam automaticamente este modelo como backup quando falham.
Como configurar:
- Acesse a página de configurações de estratégia do ciyuan_market.
- Encontre a configuração de Modelo de Fallback Padrão.
- Selecione seu modelo de fallback global na lista suspensa.
- Salve a configuração para aplicá-la imediatamente.
Vantagens da configuração global:
- Sem alterações de código: configure uma vez e aplica-se globalmente, sem necessidade de repetir a configuração em cada solicitação.
- Gerenciamento centralizado: gerencie a política de fallback em um único local para ajuste e monitoramento mais fáceis.
- Manutenção simplificada: reduz a complexidade do código e a chance de erros de configuração.
- Substituição flexível: a configuração de fallback no nível da solicitação tem prioridade e pode substituir a configuração global para cenários específicos.
Configuração de fallback no nível da solicitação
Para cenários de negócio específicos, você pode especificar um modelo de fallback em uma solicitação individual para substituir a configuração global.
Especifique o modelo de fallback com o parâmetro router.fallBackModels:
{
"model": "claude-sonnet-4",
"messages": [
{
"role": "user",
"content": "Explain what quantum computing is"
}
],
"router": {
"fallBackModels": ["glm-5.2"]
}
}
Regras de prioridade
Quando várias configurações de fallback estão presentes, a prioridade vai da mais alta para a mais baixa:
router.fallBackModelsno nível da solicitação: o modelo de fallback especificado em uma solicitação individual.- Global Default Fallback Model: the global fallback model configured in the console.
- No fallback: if neither is configured, the request returns an error on failure.
- Se todos os modelos de fallback falharem, o sistema retorna o motivo da falha do último modelo tentado.
- Quando ocorre um fallback, a resposta indica o modelo realmente usado, facilitando o monitoramento e a análise.
Administração da conta
Dependendo do tipo de conta, o console pode incluir ativação de modelos no nível da conta, controles de revendedor ou distribuidor, configuração de cobrança e configurações de acesso. Os administradores podem usar esses controles para alinhar o acesso a modelos, a visibilidade de uso e a responsabilidade de cobrança com aplicações, contas de cliente ou unidades de negócio.
Lista de verificação de operações de produção
| Item | Recomendação |
|---|---|
| Chaves API | Use chaves de produção dedicadas com rótulos claros. |
| Models | Confirme a disponibilidade do modelo, preço, comprimento de contexto e capacidades necessárias. |
| Routing | Configure aliases de roteamento ou políticas de fallback para cargas de trabalho críticas. |
| Logs | Garanta que os IDs de solicitação sejam capturados nos logs da aplicação. |
| Billing | Confirme o saldo da carteira, o status do plano e as regras de dedução de créditos. |
| Rate limits | Revise RPM, TPM, concorrência e limites de tarefas de mídia no nível da conta. |
| Alerts | Monitore o crescimento de uso, saldo de créditos, erros e disponibilidade do provedor. |
Cobrança e créditos
O ciyuan_market usa um modelo de cobrança baseado em créditos para cargas de trabalho de texto, imagem, vídeo e outros modelos suportados. Os créditos fornecem uma unidade unificada para uso de múltiplos modelos e múltiplos provedores, permitindo que as equipes gerenciem o consumo de forma consistente entre modalidades e famílias de API.
Os preços detalhados dos modelos estão disponíveis na página de Modelos ou através das APIs de metadados de modelo. O preço pode variar por modelo, provedor, modalidade, resolução, tipo de token, compramento de saída, duração da tarefa, tipo de conta e acordo comercial.
Recarga e carteira
As contas podem adicionar créditos de carteira pré-pagos para uso flexível. Os créditos da carteira são usados após os créditos do plano mensal e dos pacotes de recursos serem consumidos, a menos que uma regra billing rule applies to the account.
Os créditos da carteira não expiram, salvo especificação em contrário nos termos comerciais aplicáveis. Uma taxa de serviço é cobrada ao recarregar a carteira pré-paga.
Planos mensais e pacotes de recursos
Cada usuário ou conta pode selecionar um plano mensal ativo. Os planos mensais fornecem uma quantidade definida de capacidade de uso, termos comerciais e configuração de acesso no nível da conta para o período de cobrança.
Os usuários também podem comprar vários pacotes de recursos para capacidade de uso adicional. Os pacotes de recursos podem separar o uso comprometido do saldo da carteira pré-paga e são úteis para uso de alto volume de texto, imagem, vídeo ou cargas de trabalho dedicadas.
Ordem de dedução
A menos que regras de cobrança personalizadas estejam configuradas, os créditos são deduzidos na seguinte ordem:
| Prioridade | Origem do crédito | Descrição |
|---|---|---|
| 1 | Monthly plan | A capacidade de uso mensal incluída é consumida primeiro. |
| 2 | Resource packs | Pacotes adicionais comprados são consumidos após os créditos do plano mensal. |
| 3 | Pay-as-you-go wallet | O saldo da carteira é consumido após os créditos do plano e dos pacotes de recursos. |
Para contas com termos comerciais personalizados, a ordem de dedução, regras de expiração, uso incluído e preços podem ser diferentes. As regras específicas da conta são mostradas no console ou fornecidas através do acordo comercial.
Preços personalizados
Os preços podem ser personalizados para cada usuário ou conta. Clientes corporativos, contas de revendedor, contas de distribuidor e clientes de alto volume podem ser elegíveis para preços personalizados. Entre em contato com as vendas para uma cotação.
Os preços personalizados podem ser configurados por conta, modelo, provedor, modalidade, região, volume de uso ou acordo comercial. Quando os preços personalizados são ativados, o console e as APIs de cobrança refletem os preços e regras de dedução específicos da conta quando disponíveis.
Unidades de preço
Different model modalities use different measurement units. ciyuan_market converts these units into credits according to the model’s pricing rules.
| Modalidade | Base comum de preço |
|---|---|
| Text | Tokens de entrada, tokens de saída, tokens de leitura em cache, tokens de escrita em cache, tokens de raciocínio ou categorias de token específicas do modelo. |
| Image | Modelo, resolução, número de imagens geradas, uso de imagem de entrada, modo de edição ou configuração de qualidade. |
| Video | Modelo, resolução de saída, segundos gerados, proporção da tela, uso de imagem ou vídeo de entrada e tipo de tarefa. |
| Embeddings | Tokens de entrada ou número de registros de embedding. |
| Audio | Duração de entrada, duração de saída, comprimento de transcrição ou unidades de áudio específicas do modelo. |
As unidades de preço podem variar por modelo. Sempre consulte a página de detalhes do modelo ou os metadados de preço antes de ativar um modelo em produção.
Atribuição de uso
O uso do ciyuan_market pode ser revisado por conta, chave API, modelo, modalidade ou intervalo de tempo. Isso permite que as equipes atribuam custos a aplicações, ambientes, clientes ou unidades de negócio internas.
| Dimensão | Descrição |
|---|---|
| Chave API | Agrupe o uso por aplicação, serviço ou ambiente. |
| Modelo | Compare custo e volume por modelo selecionado. |
| Resolved model | Revise o modelo real usado após roteamento ou fallback. |
| Modality | Separe o uso de texto, imagem, vídeo, embedding e áudio. |
| Time range | Revise períodos de relatório diários, mensais ou personalizados. |
| Metadata | Agrupe o uso por metadados de solicitação personalizados, como ID do cliente, ID do tenant, ID do usuário ou ambiente. |
Saldo de créditos
Verifique quantos créditos estão disponíveis em sua conta. O saldo é dividido em três carteiras que são deduzidas em ordem: a allowances do plano mensal, pacotes de recursos comprados e a carteira pré-paga. Um total combinado de recursos (plano mensal + pacotes de recursos, excluindo o pré-pago) também está disponível para rastrear o uso incluído separadamente dos gastos de recarga.
Para recuperar isso programaticamente, consulte
GET /v1/billing/balance na Referência da
API.
Detalhes de uso
Revise uma lista paginada e cronológica de registros de uso individuais para relatórios, monitoramento e alocação interna de custos. Cada registro mostra o modelo, tipo de modelo (texto, imagem ou vídeo), os créditos deduzidos e um detalhamento de qual carteira cada dedução foi retirada. Os resultados podem ser filtrados por um intervalo de tempo específico.
Para recuperar isso programaticamente, consulte
GET /v1/usage na Referência da API.
Histórico de transações
Use o histórico de transações para revisar movimentações de créditos, incluindo recargas, alocações de plano, concessões de pacotes de recursos, deduções de uso, ajustes e correções administrativas.
Para recuperar isso programaticamente, consulte
GET /v1/billing/transactions na
Referência da API.
Solicitações com falha e reembolsos
Erros de validação, erros de autenticação e erros de permissão geralmente não são cobrados porque nenhuma execução de modelo ocorre. Solicitações que alcançam um modelo upstream ou geram saída parcial podem consumir créditos dependendo do modelo, provedor e estado da resposta.
Para tarefas assíncronas de imagem e vídeo, o comportamento de cobrança depende se a tarefa foi aceita, iniciada, concluída, falhou ou foi cancelada. A resposta de detalhes da tarefa inclui informações de uso quando os créditos foram consumidos.
Recargas, planos mensais, pacotes de recursos e créditos consumidos não são reembolsáveis, a menos que especificado de outra forma no acordo comercial aplicável ou exigido por lei.
Referência da API
Convenções comuns
URL base
Todos os endpoints são servidos sob o prefixo /v1.
Autenticação
Chamadas para endpoints /v1/* usam autenticação por
Chave API (não JWT). A Chave API é passada pelo seguinte cabeçalho:
| Cabeçalho | Formato | Descrição |
|---|---|---|
Authorization | Bearer <api_key> | Estilo OpenAI. O endpoint compatível com Anthropic também aceita
x-api-key com anthropic-version: 2023-06-01. |
Chaves ausentes ou inválidas retornam 401.
Pré-verificação de saldo
Todos os endpoints de chamada de modelo executam uma pré-verificação de saldo antes da execução:
- Insufficient balance returns
Insufficient credit, mapped to:- Protocolo OpenAI: HTTP
400,code = insufficient_quota - Protocolo Anthropic: HTTP
402,type = billing_error
- Protocolo OpenAI: HTTP
- Alguns endpoints também estimam um custo mínimo por modelo para uma segunda pré-verificação.
POST https://api.ciyuan-market.com/api/v1/chat/completions
Endpoint compatível com OpenAI Chat Completions. Suporta streaming e não streaming, chamadas de ferramentas, modo JSON e entrada multimodal.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model | String | Sim | Nome do modelo. |
messages | Message[] | Sim | Mensagens da conversa. |
stream | Boolean | Não | Modo de stream, padrão false. |
temperature | Double | Não | Temperatura de amostragem. |
max_tokens | Integer | Não | Máximo de tokens de saída. |
top_p | Double | Não | Amostragem por núcleo. |
presence_penalty | Double | No | — |
frequency_penalty | Double | No | — |
tools | Tool[] | Não | Definições de ferramentas. |
tool_choice | String|Object | No | auto / none / required / função
específica. |
response_format | Object | No | {type, json_schema:{name,schema,strict}};
text/json_object/json_schema. |
parallel_tool_calls | Boolean | Não | — |
metadata | Map | Não | Metadados de passagem. |
Campos de Message:
| Campo | Tipo | Descrição |
|---|---|---|
role | String | system / user / assistant /
tool. |
content | String|Array | Texto simples ou array de blocos de conteúdo multimodal
([{type:"text",text},{type:"image_url",image_url:{url}}]). |
tool_call_id | String | Vincula ao tool_calls quando role=tool. |
tool_calls | ToolCall[] | Presente quando role=assistant faz chamadas de ferramentas. |
| Campo | Tipo | Descrição |
|---|---|---|
type | String | Fixo function. |
function | Object | Definição da função. |
function.name | String | Nome da função. |
function.description | String | Descrição da função. |
function.parameters | Object | Esquema JSON para entradas. |
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}
}
Campos de resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID de conclusão. |
object | String | Fixo chat.completion. |
created | Long | Carimbo de data/hora de criação (segundos). |
model | String | Nome do modelo. |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da chamada de ferramenta. |
type | String | Fixo function. |
function | Object | Detalhes da chamada de função. |
function.name | String | Nome da função. |
function.arguments | Object | Argumentos da função. |
Exemplo de resposta em streaming:
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
Endpoint compatível com OpenAI Responses. Usa input em vez de
messages, instructions em vez de uma mensagem de sistema, e um
bloco text em vez de response_format.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model | String | Sim | Nome do modelo. |
input | String|Array | Yes | String simples (mensagem do usuário) ou array de objetos de mensagem. |
instructions | String | Não | Prompt de sistema. |
stream | Boolean | Não | Padrão false. |
max_output_tokens | Integer | Não | Máximo de tokens de saída. |
temperature | Double | Não | Padrão 1. |
top_p | Double | No | — |
tools | Tool[] | No | Nível superior {type, name, description, parameters}. |
tool_choice | String|Object | No | auto/none/required/{type,name}. |
text | Object | No | {format:{type, name, schema, strict}};
text/json_object/json_schema. |
metadata | Map | No | — |
previous_response_id | String | Não | ID da resposta anterior para múltiplos turnos. |
parallel_tool_calls | Boolean | Não | — |
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}
}
Campos de resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da resposta. |
object | String | Fixo response. |
model | String | Nome do modelo. |
status | String | ex. completed. |
created_at | Long | Carimbo de data/hora de criação (segundos). |
output | Array | Output items. Message items:
{id, type:"message", role, content:[{type:"output_text",
text}], status}. Tool-call items:
{type:"function_call", id, name, call_id, arguments, status}. |
usage | Object | {input_tokens, output_tokens, total_tokens}. Para modelos Claude,
input_tokens inclui cache_read e
output_tokens inclui cache_write. |
O streaming segue os eventos da API Responses:
| Evento | Descrição |
|---|---|
response.created | Início do fluxo de resposta. |
response.output_text.delta | Atualização incremental de saída de texto. |
response.completed | Fim do fluxo de resposta. |
POST https://api.ciyuan-market.com/api/v1/messages
Endpoint compatível com Anthropic Messages. Aceita cabeçalhos x-api-key e
anthropic-version: 2023-06-01. Os blocos de conteúdo suportam
text, image, tool_use, tool_result,
thinking e redacted_thinking.
| Campo | Tipo | Obrigatório | Campo JSON | Description |
|---|---|---|---|---|
model | String | Yes | model | Model name. |
messages | Message[] | Yes | messages | Conversation messages. |
system | String|Array | No | system | Prompt de sistema, string ou [{type,text}]. |
maxTokens | Integer | Yes | max_tokens | Maximum output tokens. |
stream | Boolean | No | stream | Streaming. |
temperature | Double | No | temperature | — |
topP | Double | No | top_p | — |
topK | Integer | No | top_k | — |
tools | Tool[] | No | tools | Definições de ferramentas (input_schema). |
toolChoice | Object | No | tool_choice | — |
metadata | Map | No | metadata | — |
thinking | Object | No | thinking | Configuração de raciocínio estendido. |
stopSequences | Object | No | stop_sequences | — |
anthropicBeta | Object | No | anthropic_beta | Cabeçalho de recurso beta. |
| Campo | Tipo | Descrição |
|---|---|---|
role | String | Papel da mensagem, ex. user / assistant. |
content | String|ContentBlock[] | Texto simples ou um array de blocos de conteúdo. |
| Campo | Tipo | Descrição |
|---|---|---|
type | String | Um entre text, image, tool_use,
tool_result, thinking,
redacted_thinking. |
text | String | Presente quando o tipo é texto. |
source | Object | Present when type is image. |
Exemplos de bloco de imagem:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
| Campo | Tipo | Descrição |
|---|---|---|
name | String | Nome da função. |
description | String | Descrição da função. |
input_schema | Object | Esquema JSON para entradas. |
cache_control | Object | Controle de cache opcional. |
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}
}
Campos de resposta (não streaming):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da mensagem. |
type | String | Fixo message. |
role | String | Fixo assistant. |
model | String | Nome do modelo. |
content | ContentBlock[] | Blocos de conteúdo da resposta (ex. {type:"text", text},
{type:"tool_use", ...}). |
stop_reason | String | ex. end_turn, tool_use, max_tokens. |
usage | Object | {input_tokens, output_tokens}. |
| Evento | Descrição |
|---|---|
message_start | Início do fluxo de mensagens. |
content_block_start | Início de um novo bloco de conteúdo. |
content_block_delta | Atualização incremental de um bloco de conteúdo. |
content_block_stop | Fim de um bloco de conteúdo. |
message_delta | Atualização incremental da mensagem. |
message_stop | Fim do fluxo de mensagens. |
GET https://api.ciyuan-market.com/api/v1/models
Retorna todos os modelos de API online e ativados.
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": "..."
}
]
}
Campos de cada entrada de modelo (data[]):
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixo model. |
display_name | String | Nome de exibição. |
created | Long | Carimbo de data/hora de criação (segundos). |
owned_by | String | Proprietário / fornecedor. |
input_modalities | String[] | e.g. ["text","image"]. |
output_modalities | String[] | e.g. ["text"]. |
context_length | Integer | Comprimento máximo de contexto. |
description | String | Descrição do modelo. |
GET https://api.ciyuan-market.com/api/v1/models/{model}
Retorna um único modelo com o mesmo formato de uma entrada de lista. Retorna HTTP 404 quando o modelo não existe.
curl --request GET \
--url https://api.ciyuan-market.com/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $CIYUAN_MARKET_API_KEY"
Resposta de sucesso: um objeto de modelo único com os mesmos campos de uma entrada de
lista /v1/models.
Quando o modelo não existe, retorna 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
Consulte as resoluções, proporções e contagens máximas suportadas por um modelo de
imagem antes de chamar /v1/image-generations. Não requer autenticação.
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixed image_model. |
displayName | String | Nome de exibição. |
description | String | Descrição do modelo. |
icon | String | URL do ícone. |
created | Long | Carimbo de data/hora de criação (segundos). |
maxCount | Integer | Máximo de imagens por solicitação. |
fileMax | Integer | Máximo de imagens de referência. Quando 0, não suporta geração de imagem a partir de imagem. |
resolutions | String[] | Supported resolutions, e.g.
["720p","1080p"]. |
ratios | String[] | Supported aspect ratios, e.g.
["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
Consulte os valores de videoType suportados, intervalo de duração,
resoluções e proporções para um modelo de vídeo antes de chamar
/v1/video-generations. Não requer autenticação.
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID do modelo. |
object | String | Fixed video_model. |
displayName | String | Nome de exibição. |
description | String | Descrição do modelo. |
icon | String | URL do ícone. |
created | Long | Carimbo de data/hora de criação (segundos). |
allowedVideoTypes | VideoTypeOption[] | Lista de videoType suportados. |
videoDurationMin | Integer | Mínimo de segundos por clipe. |
videoDurationMax | Integer | Máximo de segundos por clipe. |
videoDurationSuggest | Integer[] | Passos de duração recomendados, ex. [5,8,10]. |
resolutions | String[] | Resoluções suportadas. |
ratios | String[] | Proporções de tela suportadas. |
resolutionOptions | ResolutionOption[] | Combinações estruturadas de resolução+proporção+tamanho. |
fileMax | Integer | Máximo de ativos de referência. |
Campos de VideoTypeOption:
| Campo | Tipo | Descrição |
|---|---|---|
code | Integer | O valor de videoType a ser passado para
/v1/video-generations. |
name | String | Nome do tipo localizado (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
}
]
}
Descrição dos campos de faixas de preço
Os 4 endpoints de consulta de modelos /v1/models,
/v1/models/{model}, /v1/image-models e
/v1/video-models retornam o
preço de faturamento efetivo para o chamador (usuário de API Key),
totalmente consistente com a cobrança real, e retornam
todas as faixas de preço do modelo.
Diferença de nomenclatura: /v1/models e
/v1/models/{model} usam o estilo OpenAI snake_case
(price_tiers); /v1/image-models e
/v1/video-models usam camelCase (priceTiers). As estruturas
são idênticas.
price_tiers / priceTiers é um array; cada elemento é uma
faixa de preço:
| Campo | Tipo | Descrição |
|---|---|---|
outputPrice | decimal | Preço unitário de saída efetivo para o chamador atual |
cachePrice | decimal | Preço de cache (modelos gerais, usado pela fórmula de faturamento antiga) |
cacheReadPrice | decimal | Preço unitário de leitura de cache (exclusivo do Bedrock Claude) |
cacheWritePrice | decimal | Preço unitário de escrita de cache (exclusivo do Bedrock Claude) |
ratio | decimal | Multiplicador de faturamento. O modo FIXED é 1; o modo RATIO é o multiplicador de usuário/grupo |
mode | string | Modo de preço: RATIO / FIXED |
planId | string | ID do plano de preços correspondente, pode ser null |
Os três tipos de modelo compartilham a mesma estrutura; apenas o preenchimento dos campos descritivos difere. Campos não aplicáveis são null:
| Tipo de modelo | UNIT | Campos descritivos efetivos |
|---|---|---|
| Texto | token | region / bandMin / bandMax |
| Imagem | image | resolution / clarity |
| Vídeo | video | resolution / clarity |
Significado do preço: os valores inputPrice / outputPrice /
cacheReadPrice / cacheWritePrice retornados são os preços
unitários de faturamento finais para o usuário de API Key atual após a resolução pela
cadeia de preços (chain)→ guidance → preço base, consistentes com a cobrança real. O
preço unitário visto pelo chamador varia de acordo com a cadeia de preços à qual
pertence (reseller / distributor / empresa / configuração em nível de usuário).
Dedução real = uso ÷ quantity × preço unitário correspondente × ratio. Para vídeo por segundo: dedução real = duration × outputPrice × ratio.
Limites e tratamento de exceções (endpoints somente leitura não retornarão 500 devido a problemas de configuração de preços)
| Cenário | Comportamento |
|---|---|
| Falha na resolução de uma única faixa (política de preços nega acesso, configuração ausente) | Ignorar essa faixa, registrar log warn e continuar resolvendo as faixas restantes |
| Todas as faixas de um modelo falham na resolução | Array vazio [], o modelo ainda é retornado normalmente |
| O modelo não possui nenhuma configuração de preços | Array vazio [] |
| A análise de preços lança uma exceção não capturada | try-catch geral, retornar array vazio, o endpoint ainda retorna 200 |
Exemplo de resposta (/v1/models, modelo de texto):
{
"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": "por cada 1k tokens",
"inputPrice": 0.0025,
"outputPrice": 0.01,
"cachePrice": 0.00125,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Exemplo de resposta (/v1/image-models, modelo de imagem, a estrutura de
priceTiers é a mesma, 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": "por imagem",
"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
Envie assincronamente uma tarefa de geração de imagem. Retorna um taskId
imediatamente; recupere o resultado fazendo polling de
GET /v1/image-generations/{taskId} ou via webhook
callbackUrl.
O model, os valores de resolution /
ratio suportados, o limite máximo de count e o limite de
upload de imagens de referência (fileMax) devem ser obtidos primeiro em
GET /v1/image-models. Apenas os valores divulgados na especificação do modelo são aceitos.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
text | String | Sim | Prompt. |
model | String | Sim | Nome do modelo. |
imageUrls | String[] | No | URLs de imagens de referência (imagem-para-imagem). |
count | Integer | No | Número de imagens (≥0). |
resolution | String | No | Resolução (consulte /v1/image-models). |
ratio | String | Não | Proporção da tela. |
callbackUrl | String | Não | URL de webhook no nível da tarefa. |
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"}
}
Respostas de erro:
// 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}
Faça polling de uma tarefa de geração de imagem. status é
pending / success / failed. images é
um array em string JSON de URLs de imagem; text contém qualquer descrição
de texto anexada pelo modelo (ex. saída multimodal do Gemini), null caso
contrário.
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
}
}
Campos de data da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
taskId | String | ID da tarefa. |
status | String | pending / success / failed. |
errorMessage | String | Motivo da falha, null em caso de sucesso. |
images | String | JSON-stringified array of image URLs, e.g.
"[\"https://.../1.png\"]". |
text | String | Descrição de texto anexada pelo modelo (ex. saída multimodal do Gemini);
null caso contrário. |
Tarefa não encontrada:
{ "code": 500, "message": "task not found" }
Se callbackUrl foi fornecido no envio, o servidor envia o resultado final
success / failed via webhook com o mesmo formato de
data.
Exemplo completo (envio + polling)
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
Envie assincronamente uma tarefa de geração de vídeo. Retorna um taskId
imediatamente; recupere o resultado fazendo polling de
GET /v1/video-generations/{taskId} ou via webhook
callbackUrl.
O model, os valores de videoType permitidos, o intervalo de
duração (videoDurationMin/Max), resolution /
ratio suportados e o limite de upload de ativos de referência
(fileMax) devem ser obtidos primeiro em
GET /v1/video-models. Apenas códigos de videoType listados em
allowedVideoTypes do modelo são aceitos.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
text | String | Sim | Prompt. |
model | String | Sim | Nome do modelo. |
videoType | Integer | Yes | 1 texto-para-vídeo / 2 imagem-para-vídeo (primeiro quadro) / 3 imagem-para-vídeo (primeiro+último quadro) / 4 imagem-para-vídeo (referência) / 5 todas as referências. |
imageUrls | String[] | No | URLs de ativos de imagem. |
videoUrls | VideoUrl[]|String[] | No | URLs de ativos de vídeo. |
audioUrls | String[] | No | URLs de ativos de áudio. |
resolution | String | Não | Resolução. |
ratio | String | Não | Proporção da tela. |
duration | Long | Não | Segundos (>0). |
callbackUrl | String | Não | URL de webhook no nível da tarefa. |
Exemplos para cada videoType:
1. Texto para vídeo (videoType=1)
Gere um vídeo apenas a partir de um prompt de texto; não são necessários ativos de referência.
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. Imagem para vídeo - primeiro quadro (videoType=2)
Forneça um único quadro inicial em imageUrls; o modelo gera um vídeo a
partir desse quadro.
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. Imagem para vídeo - primeiro e último quadro (videoType=3)
Forneça o primeiro e o último quadro em imageUrls (ordem:
[primeiro, último]); o modelo gera um vídeo de transição entre os dois
quadros.
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. Imagem para vídeo - referência (videoType=4)
Forneça uma ou mais imagens de referência em imageUrls; o modelo usa o
estilo/conteúdo delas como referência (não como um primeiro/último quadro forçado) para
gerar o vídeo.
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. Todas as referências (videoType=5)
Referências mistas de imagem / vídeo / áudio. Faça referência aos ativos por posição no
prompt: a 1ª entrada em imageUrls é @图片 1, a 1ª em
videoUrls é @视频 1, a 1ª em audioUrls é
@音频 1. videoUrls também aceita strings de URL simples.
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
}'
Resposta de envio (todos os cinco tipos):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}
GET https://api.ciyuan-market.com/api/v1/video-generations/{taskId}
Faça polling de uma tarefa de geração de vídeo. status é
pending / success / failed;
videoUrl é a URL do vídeo gerado e lastFrameUrl é a URL do
último quadro (cenários de imagem-para-vídeo).
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
}
}
Campos de data da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL do vídeo gerado. |
lastFrameUrl | String | URL do último quadro (cenários de imagem-para-vídeo); null caso
contrário. |
message | String | Motivo da falha, null em caso de sucesso. |
Se callbackUrl foi fornecido no envio, o servidor envia o resultado final
via webhook com o mesmo formato de data.
Exemplo completo (envio + polling)
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
Retorna o saldo da conta dividido em três carteiras: plano mensal, pacotes de recursos e crédito pré-pago.
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
}
}
Campos de resposta:
| Campo | Tipo | Descrição |
|---|---|---|
totalCredit | BigDecimal | Saldo total. |
totalResourceCredit | BigDecimal | Soma dos saldos dos pacotes de recursos. |
wallets.monthlyPlan | WalletDetail | Plano mensal (null se nenhum). |
wallets.resourcePacks | WalletDetail[] | Lista de pacotes de recursos. |
wallets.payAsYouGo | BigDecimal | Saldo pré-pago. |
Campos de WalletDetailVO:
| Campo | Tipo | Descrição |
|---|---|---|
id | String | ID da carteira. |
credit | BigDecimal | Créditos do saldo. |
name | String | Nome da carteira. |
GET https://api.ciyuan-market.com/api/v1/usage
Detalhes de cobrança paginados de chamadas de modelo, com snapshot por preço
(priceSnapshotId), ordenados por tempo de criação do pedido em ordem
decrescente. Apenas registros de cobrança normal (reason = model usage) são
retornados.
Parâmetros de consulta:
| Parâmetro | Tipo | Obrigatório | Padrão | Description |
|---|---|---|---|---|
page | Integer | No | 1 | Número da página, baseado em 1. |
size | Integer | No | 20 | Tamanho da página (paginado por priceSnapshotId). |
startTime | LocalDateTime | No | — | Hora de início, formato yyyy-MM-ddTHH:mm:ss, filtra por snapshot
orderCreatedAt. |
endTime | LocalDateTime | No | — | Hora de término, formato 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"
Wrapper de resposta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descrição |
|---|---|---|
records | UsageDetailVO[] | Registros da página atual. |
total | Long | Contagem total. |
current | Long | Página atual. |
size | Long | Tamanho da página. |
pages | Long | Total de páginas. |
Campos de UsageDetailVO:
| Campo | Tipo | Descrição |
|---|---|---|
priceSnapshotId | String | ID do snapshot de preço. |
taskId | String | ID da tarefa. |
credit | BigDecimal | Valor cobrado. |
model | String | Nome do modelo. |
modelType | String | text / image / video. |
inputTokens | Long | Tokens de entrada; null para imagem/vídeo. |
outputTokens | Long | Tokens de saída. |
totalTokens | Long | Total de tokens. |
cacheReadTokens | Long | Tokens de leitura em cache. |
cacheWriteTokens | Long | Tokens de escrita em cache. |
imageCount | Integer | Contagem de imagens; definido para modelos de imagem. |
imageResolution | String | Resolução da imagem, ex. 720P. |
imageRatio | String | Proporção da imagem, ex. 1:1. |
videoResolution | String | Resolução do vídeo, ex. 1080p. |
videoRatio | String | Proporção do vídeo, ex. 16:9. |
videoDurationSec | Long | Duração do vídeo em segundos. |
orderCreatedAt | LocalDateTime | Tempo de criação do pedido (snapshot orderCreatedAt). |
creditDetails | CreditDetailItem[] | Detalhes do pedido neste snapshot (de credit_order_t). |
Campos de CreditDetailItem:
| Campo | Tipo | Descrição |
|---|---|---|
credit | BigDecimal | Valor cobrado por este pedido. |
deductionSource | String | Origem da dedução (Balance / Monthly Package /
Resource Package). |
packageName | String | Nome do pacote; null se nenhum pacote. |
Convenção de valor nulo: apenas os campos relevantes para cada
modelType são preenchidos; o restante é null.
text preenche os campos de token; image preenche
imageCount/imageResolution/imageRatio; video preenche
videoResolution/videoRatio/videoDurationSec.
Exemplo de resposta:
{
"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
Lista paginada das transações de recarga pagas (status=2) do usuário
atual, ordenadas por created_at em ordem decrescente.
| Parâmetro | Tipo | Obrigatório | Padrão | Description |
|---|---|---|---|---|
page | Integer | No | 1 | Número da página. |
size | Integer | No | 20 | Tamanho da página. |
startTime | String | No | — | Hora de início, yyyy-MM-dd HH:mm:ss, inclusivo. |
endTime | String | No | — | Hora de término, yyyy-MM-dd HH:mm:ss, inclusivo. |
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"
Wrapper de resposta:
{
"code": 0,
"message": "success",
"data": { ... }
}
| Campo | Tipo | Descrição |
|---|---|---|
records | TransactionVO[] | Transações da página atual. |
total | Long | Contagem total. |
current | Long | Página atual. |
size | Long | Tamanho da página. |
pages | Long | Total de páginas. |
Campos de TransactionVO:
| Campo | Tipo | Descrição |
|---|---|---|
orderNo | String | Número do pedido. |
thirdPartyOrderNo | String | Número do pedido de terceiros. |
amount | BigDecimal | Valor do pedido. |
actualAmount | BigDecimal | Valor efetivamente pago. |
discount | BigDecimal | Valor do desconto. |
paymentMethod | String | Método de pagamento (wechat / alipay /
ustd / stripe / wallyt etc.). |
Campos de TransactionVO:
| Campo | Tipo | Descrição |
|---|---|---|
serviceFeeAmount | BigDecimal | Valor da taxa de serviço. |
paymentChannel | String | Plataforma de pagamento. |
source | String | Origem do pedido (recharge /
package_purchase etc.). |
packageName | String | Nome do pacote (definido para compras de pacotes; null para
recargas simples). |
createdAt | LocalDateTime | Tempo de criação. |
{
"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
}
}
Operacional
Erros
O ciyuan_market retorna códigos de erro estáveis para que as aplicações possam lidar com repetições, fallbacks, problemas de cobrança e depuração de forma consistente.
Endpoints compatíveis com provedores tentam preservar o formato de erro da família de API original quando possível. Endpoints nativos do ciyuan_market usam o objeto de erro do ciyuan_market.
Mapeamento de status HTTP e códigos de erro
| Status HTTP | Tipo de erro | Códigos de exemplo | Repetir |
|---|---|---|---|
| 400 | invalid_request_error | invalid_request, unsupported_parameter,
invalid_messages, invalid_image_url | Não |
| 401 | authentication_error | missing_api_key, invalid_api_key | Não |
| 402 | billing_error | insufficient_credits, payment_required,
quota_exceeded | Não |
| 403 | permission_error | model_access_denied, endpoint_access_denied,
key_scope_denied | Não |
| 404 | not_found_error | model_not_found, response_not_found,
task_not_found | Não |
| 408 | timeout_error | gateway_timeout, provider_timeout | Sim |
| 409 | conflict_error | idempotency_conflict, task_already_cancelled | Depende |
| 422 | validation_error | schema_validation_failed, unsupported_modality | Não |
| 429 | rate_limit_error | account_rpm_exceeded, account_tpm_exceeded,
provider_rate_limited | Sim |
| 500 | internal_error | internal_error | Sim |
| 502 | provider_error | provider_bad_gateway, provider_invalid_response | Sim |
| 503 | service_unavailable | model_unavailable, provider_unavailable,
insufficient_capacity | Sim |
| 504 | timeout_error | provider_timeout, gateway_timeout | Sim |
Códigos de erro comuns
| Código | Significado | Ação recomendada |
|---|---|---|
missing_api_key | Nenhuma chave API foi fornecida. | Adicione o cabeçalho Authorization. |
invalid_api_key | A chave API é inválida ou revogada. | Crie ou rotacione a chave API. |
model_not_found | O ID do modelo não existe ou não está ativado para a conta. | Consulte a página de Modelos ou chame GET /v1/models. |
model_access_denied | A chave API ou a conta não tem acesso ao modelo. | Ative o modelo ou contate o administrador. |
unsupported_parameter | A solicitação inclui um parâmetro não suportado pelo endpoint ou modelo selecionado. | Remova o parâmetro ou escolha um modelo compatível. |
unsupported_modality | A modalidade de entrada ou saída não é suportada pelo modelo selecionado. | Escolha um modelo que suporte a modalidade. |
account_rpm_exceeded | Limite de solicitações por minuto da conta excedido. | Repita com backoff ou solicite limites maiores. |
account_tpm_exceeded | Limite de tokens por minuto da conta excedido. | Repita com backoff, reduza tokens ou solicite limites maiores. |
provider_rate_limited | O provedor upstream limitou a taxa da solicitação. | Repita ou ative o fallback. |
insufficient_credits | A conta tem créditos insuficientes. | Recarregue a carteira, compre um pacote ou faça upgrade do plano. |
provider_timeout | O provedor upstream não respondeu a tempo. | Repita ou ative o fallback. |
model_unavailable | O modelo está temporariamente indisponível. | Repita ou use um alias de roteamento. |
content_policy_error | A solicitação ou saída foi bloqueada por uma política de segurança. | Modifique a entrada ou escolha um fluxo de trabalho adequado. |
MCP
Guia MCP do ciyuan_market
Encapsula o ciyuan_market (um gateway de LLM compatível com OpenAI) como um servidor MCP, para que suas ferramentas de IA possam chamar diretamente os endpoints de chat, modelos, cobrança, imagem e vídeo do ciyuan_market.
Recursos
- 🤖 Chat multi-API: suporta os endpoints compatíveis com OpenAI Chat Completions, Anthropic Messages e OpenAI Responses
- 🖼️ Geração multimodal: além do chat de texto, suporta tarefas assíncronas de geração de imagem e vídeo (texto-para-, imagem-para-, primeiro/último quadro, ativo de referência)
- 🔍 Consulta de modelos e conta: lista modelos disponíveis, detalhes de modelos, saldo da conta, detalhes de uso/cobrança e transações de recarga
- 🔑 Chave passada via cabeçalho: cada chamada lê a chave da API a partir do cabeçalho da requisição, então uma única implantação pode ser compartilhada por várias contas — o servidor nunca persiste nem armazena em cache qualquer chave
Início rápido
Use no Claude Code (recomendado). Adicione -s user para registrá-lo no
escopo do usuário (disponível em todos os seus projetos).
Passo 1: Adicionar a conexão
claude mcp add --transport http ciyuanmarket https://api.ciyuan-market.com/mcp \
--header "X-Ciyuanmarket-Api-Key: <sua chave de API do ciyuan_market>" \
-s user
Passo 2: Verificar a conexão
claude mcp list # deve mostrar ✓ Connected
claude mcp get ciyuanmarket # deve mostrar Scope: User config (available in all your projects)
Passo 3: Comece a usar
Você pode pedir ao Claude coisas como:
- "Use o ciyuan_market para chamar o claude-sonnet-5 e escrever um poema sobre o outono"
- "Liste os modelos disponíveis na minha conta ciyuan_market"
- "Verifique meu saldo e uso recente no ciyuan_market"
- "Use o ciyuan_market para gerar uma imagem de uma cidade cyberpunk à noite"
O Claude chamará automaticamente a ferramenta MCP correspondente e retornará o resultado.
Usando com o Claude Desktop
Adicione isto à seção mcpServers:
{
"mcpServers": {
"ciyuanmarket": {
"type": "http",
"url": "https://api.ciyuan-market.com/mcp",
"headers": {
"X-Ciyuanmarket-Api-Key": "<sua chave de API do ciyuan_market>"
}
}
}
}
Usando com o Codex CLI
Recomendado: use env_http_headers para ler a chave a partir de uma
variável de ambiente
Primeiro, exporte a variável de ambiente no seu shell:
export CIYUAN_MARKET_API_KEY=<sua chave de API do ciyuan_market>
Depois, em ~/.codex/config.toml:
[mcp_servers.ciyuanmarket]
url = "https://api.ciyuan-market.com/mcp"
env_http_headers = { "X-Ciyuanmarket-Api-Key" = "CIYUAN_MARKET_API_KEY" }
Alternativa: use http_headers para escrever a chave diretamente na
configuração (útil se você não quiser gerenciar uma variável de ambiente separada, mas
note que a chave fica então armazenada em texto simples no arquivo de configuração):
[mcp_servers.ciyuanmarket]
url = "https://api.ciyuan-market.com/mcp"
http_headers = { "X-Ciyuanmarket-Api-Key" = "<sua chave de API do ciyuan_market>" }
Se estiver adicionando pela interface de configurações do Codex:
- Tipo: HTTP / Streamable HTTP
- Nome: ciyuanmarket
- URL:
https://api.ciyuan-market.com/mcp - Nome do cabeçalho:
X-Ciyuanmarket-Api-Key - Valor do cabeçalho: sua chave de API do ciyuan_market
Verificar a conexão
Depois de iniciar o Codex CLI, o comando /mcp lista os servidores MCP
configurados e o status de suas conexões — basta confirmar que carregou corretamente. O
padrão de uso é igual ao do Claude: o Codex escolhe automaticamente a ferramenta
certa.
Se o seu arquivo de configuração já tiver outros servidores MCP, adicione este no mesmo nível. Saia completamente e reabra o Claude Desktop após editar.
Ferramentas
Este servidor MCP fornece 14 ferramentas, agrupadas em cinco categorias:
1. Chat
1. chat_completion — Chat Completions
Envia uma única requisição de chat e retorna a resposta completa do modelo (sem
streaming). Além de texto simples, também aceita imagens para compreensão visual (o
modelo deve suportar vision) — mude o content da mensagem de string para um
array de blocos de conteúdo misturando text e image_url.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| model | ✅ | ID do modelo, ex.: "claude-sonnet-5" — verifique primeiro com list_models |
| messages | ✅ | Lista de mensagens, cada uma no formato
{"role": "user"|"assistant"|"system", "content": "..."}; para
entrada multimodal, content é um array de blocos de conteúdo (veja Entrada
multimodal abaixo) |
| temperature | ❌ | Temperatura de amostragem — quanto maior, mais aleatório |
| max_tokens | ❌ | Número máximo de tokens a gerar |
Entrada multimodal (text / image / video)
Entrada de imagem (URL):
{"role": "user", "content": [
{"type": "text", "text": "O que há nesta imagem?"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]}
Entrada de imagem (Base64):
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<BASE64_STRING>"}}
Formatos suportados: PNG, JPEG, GIF (apenas o primeiro quadro), WebP. Limite de tamanho por imagem 20MB.
Nota: imagens grandes em Base64 produzem strings muito longas e podem falhar pelo corpo da requisição exceder o limite; prefira passar imagens por URL.
O parâmetro detail (opcional, definido no objeto image_url) controla a
fidelidade do processamento da imagem: "auto" (padrão — o modelo decide
pelo tamanho) / "low" (miniatura 512x512, rápido e barato, bom para
classificação simples) / "high" (resolução total, bom para texto pequeno /
detalhes). O array content de uma mensagem pode conter vários blocos image_url para
passar várias imagens.
Video input (URL):
{"role": "user", "content": [
{"type": "text", "text": "Descreva o que acontece neste vídeo."},
{"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>"}}
Modelos com suporte a entrada de vídeo no ciyuan_market incluem alguns modelos das séries Qwen, Doubao (dola-seed), Kimi, MiniMax — verifique input_modalities retornado por list_models. O padrão oficial Chat Completions da OpenAI não suporta vídeo nativamente, mas o gateway ciyuan_market suporta via
{"type": "video_url", "video_url": {"url": "..."}}
formato de extensão. Este formato é consistente com o formato video_url usado por OpenRouter, NVIDIA NIM, vLLM e outras plataformas.
2. create_message — Compatível com Anthropic Messages
Chama o endpoint compatível com Anthropic Messages (sem streaming). Os blocos de conteúdo suportam text, image, tool_use, tool_result, thinking, redacted_thinking. As imagens são passadas via blocos de conteúdo
{"type": "image", "source": {...}}
.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| model | ✅ | ID do modelo, ex.: "claude-sonnet-4.6" |
| messages | ✅ | Lista de mensagens; o conteúdo pode ser uma string ou um array de blocos de conteúdo (text/image/tool_use/tool_result/thinking, etc.) |
| max_tokens | ✅ | Número máximo de tokens de saída |
| system | ❌ | Prompt do sistema, uma string ou
[{"type": "text", "text": "..."}] |
| temperature / top_p / top_k | ❌ | Parâmetros de amostragem |
| tools | ❌ | Definições de ferramentas, cada uma no formato
{"name", "description", "input_schema", ...} |
| tool_choice | ❌ | Estratégia de seleção de ferramenta |
| thinking | ❌ | Configuração de raciocínio estendido |
| stop_sequences | ❌ | Sequências de parada personalizadas |
| metadata | ❌ | Metadados adicionais |
| anthropic_beta | ❌ | Identificador de recurso beta para o cabeçalho anthropic-beta |
Entrada multimodal (text / image / video)
A entrada de imagem suporta três tipos de source:
1. Codificação Base64 (atenção: o campo data é uma string Base64 pura,
sem o prefixo data:); media_type suporta
image/jpeg, image/png, image/gif, image/webp:
{"type": "image", "source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "<BASE64_STRING>"
}}
2. Referência por URL:
{"type": "image", "source": {
"type": "url",
"url": "https://example.com/image.jpg"
}}
3. File ID (primeiro faça upload da imagem via Files API com
purpose="vision" para obter um file_id):
{"type": "image", "source": {
"type": "file",
"file_id": "<file_id>"
}}
O array content de uma mensagem pode conter vários blocos image para passar várias imagens.
Nota: imagens grandes em Base64 produzem strings muito longas e podem falhar pelo corpo da requisição exceder o limite; prefira passar imagens por URL.
Entrada de vídeo: a API Anthropic Messages não suporta arquivos de vídeo nativamente. Para compreensão de vídeo, primeiro extraia quadros-chave com ffmpeg ou similar, depois passe cada quadro como um bloco de conteúdo image. Alguns gateways compatíveis podem estender o suporte a
{"type": "video", "source": {...}}
e similares — consulte a documentação do seu gateway. 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 — Compatível com OpenAI Responses
Usa input em vez de messages, instructions em
vez de mensagem de sistema e text.format em vez de
response_format. Além de texto simples, também aceita imagens para
compreensão visual (o modelo deve suportar vision) — defina input como um
array de objetos de mensagem cujo content é um array de blocos de conteúdo misturando
texto e imagens.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| model | ✅ | ID do modelo, ex.: "glm-5.2" |
| input | ✅ | Uma string simples (como uma mensagem de usuário) ou um array de objetos de mensagem (usado para entrada multimodal, veja abaixo) |
| instructions | ❌ | Prompt do sistema |
| max_output_tokens | ❌ | Número máximo de tokens de saída |
| temperature / top_p | ❌ | Parâmetros de amostragem |
| tools | ❌ | Definições de ferramentas, formato de nível superior
{"type", "name", "description", "parameters"} |
| tool_choice | ❌ | "auto" / "none" / "required" ou {"type", "name"} |
| text | ❌ | Configuração do formato de saída, ex.:
{"format": {"type": "text" | "json_object" | "json_schema", ...}} |
| previous_response_id | ❌ | ID da resposta anterior para conversas de múltiplos turnos |
| parallel_tool_calls | ❌ | Se deve permitir chamadas de ferramentas em paralelo |
| metadata | ❌ | Metadados adicionais |
Entrada multimodal (text / image / video)
Nota: a Responses API usa os tipos de bloco de conteúdo input_text /
input_image / input_video (não text / image_url / video_url do
Chat Completions), e image_url / video_url é uma string
direta, não um objeto aninhado.
Entrada de imagem (URL):
[{"role": "user", "content": [
{"type": "input_text", "text": "O que há nesta imagem?"},
{"type": "input_image", "image_url": "https://example.com/image.jpg"}
]}]
Entrada de imagem (Base64):
{"type": "input_image", "image_url": "data:image/jpeg;base64,<BASE64_STRING>"}
Formatos suportados: PNG, JPEG, GIF (apenas o primeiro quadro), WebP. Limite de tamanho por imagem 20MB.
Nota: imagens grandes em Base64 produzem strings muito longas e podem falhar pelo corpo da requisição exceder o limite; prefira passar imagens por URL.
Entrada de imagem (File ID):
{"type": "input_image", "file_id": "<file_id>"}
o file_id é obtido fazendo upload da imagem via Files API com
purpose="vision".
O parâmetro detail (opcional, no objeto input_image) controla a fidelidade
do processamento: "auto" (padrão) / "low" (miniatura 512x512,
rápido e barato) / "high" (resolução total, para texto pequeno / detalhes)
/ "original" (resolução original). O array content de uma mensagem pode
conter vários blocos input_image para várias imagens.
Video input (URL):
[{"role": "user", "content": [
{"type": "input_text", "text": "Descreva o que acontece neste vídeo."},
{"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>"}
Modelos com suporte a entrada de vídeo no ciyuan_market incluem alguns modelos das séries Qwen, Doubao (dola-seed), Kimi, MiniMax — verifique input_modalities retornado por list_models. O padrão oficial Responses API da OpenAI não suporta vídeo nativamente, mas o gateway ciyuan_market suporta via
{"type": "input_video", "video_url": "..."}
formato de extensão. Este formato é consistente com o formato input_video usado por BytePlus/Volcengine e outras plataformas.
2. Modelos e conta
4. list_models — Listar modelos disponíveis
Retorna os modelos disponíveis para a conta atual, com metadados de fornecedor,
modalidade, capacidade e preço. Sem parâmetros. Cada item da lista inclui uma faixa de
preço price_tiers — o preço de cobrança efetivo do chamador, correspondendo
ao débito real (veja
Referência do campo de faixas de preço) (only some newer
models).
5. get_model — Obter detalhes de um modelo
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| model | ✅ | ID do modelo, ex.: "gpt-5.5" — retorna um erro claro se não existir |
A resposta inclui uma faixa de preço price_tiers (veja
Referência do campo de faixas de preço); retorna 404 (sem
campos de preço) quando o modelo não existe.
6. get_balance — Verificar saldo da conta
Retorna o uso e o saldo da conta atual. Sem parâmetros.
3. Cobrança
7. list_usage — Detalhes de uso/cobrança de modelos
Detalhes paginados de cobrança por uso de modelos, ordenados pela data de criação do pedido em ordem decrescente. Apenas cobranças normais de uso — sem recargas ou ajustes.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| page | ❌ | Número da página, começando em 1, padrão 1 |
| size | ❌ | Tamanho da página, padrão 20 |
| start_time | ❌ | Hora de início, formato "yyyy-MM-ddTHH:mm:ss" (ex.: "2026-07-01T00:00:00") |
| end_time | ❌ | Hora de término, mesmo formato |
8. list_transactions — Transações de recarga/pacote
Transações pagas de recarga / compra de pacote, paginadas e ordenadas pela data de criação em ordem decrescente.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| page | ❌ | Número da página, começando em 1, padrão 1 |
| size | ❌ | Tamanho da página, padrão 20 |
| start_time | ❌ | Hora de início, formato "yyyy-MM-dd HH:mm:ss" (atenção: um espaço, não "T", entre a data e a hora) |
| end_time | ❌ | Hora de término, mesmo formato |
4. Geração de imagens
9. list_image_models — Listar modelos de imagem
Retorna os modelos de geração de imagem suportados, com resolução, proporção de tela,
número máximo de imagens (maxCount) e número máximo de imagens de referência (fileMax).
Sem parâmetros. Verifique isso antes de gerar imagens — você só pode passar valores que
ele publica. Cada item da lista inclui uma faixa de preço priceTiers (veja
Referência do campo de faixas de preço).
10. create_image_generation — Enviar uma tarefa de geração de imagem
Envia de forma assíncrona e retorna imediatamente um taskId; consome crédito da conta.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| text | ✅ | Prompt de geração de imagem |
| model | ✅ | Nome do modelo, a partir do id retornado por list_image_models |
| count | ❌ | Número de imagens a gerar |
| resolution | ❌ | Resolução, a partir das resolutions de list_image_models |
| ratio | ❌ | Proporção de tela, a partir das ratios de list_image_models |
| image_urls | ❌ | URLs de imagens de referência (imagem para imagem), quantidade limitada ao fileMax desse modelo |
| callback_url | ❌ | Webhook chamado na conclusão; omita para fazer polling |
11. get_image_generation — Consultar uma tarefa de imagem
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| task_id | ✅ | O taskId retornado por create_image_generation |
Retorna: status é pending / success / failed; images é um array de string JSON com URLs de imagens; text traz qualquer saída extra do modelo (ex.: saída multimodal do Gemini).
5. Geração de vídeos
12. list_video_models — Listar modelos de vídeo
Retorna os modelos de geração de vídeo suportados, com allowedVideoTypes, faixa de
duração (videoDurationMin/Max), resolução, proporção de tela e limite de ativos de
referência (fileMax). Sem parâmetros. Verifique isso antes de gerar vídeo. Cada item da
lista inclui uma faixa de preço priceTiers (veja
Referência do campo de faixas de preço).
13. create_video_generation — Enviar uma tarefa de geração de vídeo
Envia de forma assíncrona e retorna imediatamente um taskId; consome crédito da conta.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| text | ✅ | Prompt de geração de vídeo; quando video_type=5, ativos de referência com "@Imagem N"/"@Vídeo N"/"@Áudio N" |
| model | ✅ | Nome do modelo, a partir do id retornado por list_video_models |
| video_type | ✅ | Código do modo de geração (1-5, veja abaixo) — apenas valores em allowedVideoTypes desse modelo são válidos |
| image_urls | ❌ | URLs de imagens; o significado depende de video_type |
| video_urls | ❌ | URLs de vídeos, apenas para video_type=5 |
| audio_urls | ❌ | URLs de áudios, apenas para video_type=5 |
| resolution / ratio | ❌ | Resolução / proporção de tela, a partir de list_video_models |
| duration | ❌ | Duração do vídeo em segundos, deve estar dentro de videoDurationMin/Max |
| callback_url | ❌ | Webhook chamado na conclusão; omita para fazer polling |
Significado de video_type:
| Valor | Modo | Requisito de ativo |
|---|---|---|
| 1 | Texto para vídeo | Nenhum ativo necessário |
| 2 | Imagem para vídeo (primeiro quadro) | image_urls fornece um único quadro inicial |
| 3 | Imagem para vídeo (primeiro/último quadro) | image_urls fornece [primeiro quadro, último quadro] nessa ordem |
| 4 | Imagem para vídeo (referência) | image_urls fornece uma ou mais imagens de referência de estilo/conteúdo |
| 5 | Todas as referências | Combinação de image_urls/video_urls/audio_urls, referenciados por posição no texto |
14. get_video_generation — Consultar uma tarefa de vídeo
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
| task_id | ✅ | O taskId retornado por create_video_generation |
Referência do campo de faixas de preço
As saídas destas 4 ferramentas de consulta de modelos — list_models,
get_model, list_image_models, list_video_models —
retornam o preço de cobrança efetivo do chamador (usuário do API Key),
correspondendo exatamente ao débito real, e incluem
todas as faixas de preço do modelo.
Diferença de nomenclatura: list_models / get_model seguem o
snake_case do OpenAI (price_tiers); list_image_models /
list_video_models seguem camelCase (priceTiers). A estrutura é
a mesma.
price_tiers / priceTiers é um array; cada elemento é uma
faixa de preço:
| Campo | Tipo | Descrição |
|---|---|---|
region | string | Região de camadas V2 de modelos de texto, ex. GLOBAL /
NON_GLOBAL / us-central1. Null para modelos de
imagem/vídeo |
bandMin | long | Limite inferior da faixa de input token do modelo de texto (inclusivo); null = ilimitado |
bandMax | long | Limite superior da faixa de input token do modelo de texto (inclusivo); null = ilimitado |
resolution | string | Resolução de imagem/vídeo, ex. 1080p / 4K. Null para
modelos de texto |
clarity | string | Nível de clareza |
unit | string | Unidade de cobrança: token (texto) / image (imagem) /
video (vídeo) |
quantity | integer | Quantidade da unidade (ex. por 1000 tokens, por 1 imagem) |
description | string | Descrição do preço |
inputPrice | decimal | Preço unitário de entrada efetivo do chamador |
outputPrice | decimal | Preço unitário de saída efetivo do chamador |
cachePrice | decimal | Preço de cache (modelos gerais, fórmula de cobrança antiga) |
cacheReadPrice | decimal | Preço unitário de leitura de cache (apenas Bedrock Claude) |
cacheWritePrice | decimal | Preço unitário de escrita de cache (apenas Bedrock Claude) |
ratio | decimal | Multiplicador de cobrança. 1 no modo FIXED;
multiplicador de usuário/grupo no modo RATIO |
mode | string | Modo de preço: RATIO / FIXED |
planId | string | id do plano de preço correspondido; pode ser null |
Os três tipos de modelo compartilham a mesma estrutura; apenas os campos de descrição diferem, e campos não aplicáveis são null:
| Tipo de modelo | unit | Campos de descrição efetivos |
|---|---|---|
| Texto | token | region / bandMin / bandMax |
| Imagem | image | resolution / clarity |
| Vídeo | video | resolution / clarity |
Significado do preço: os inputPrice / outputPrice /
cacheReadPrice / cacheWritePrice retornados, etc., são os
preços unitários finais de cobrança para o usuário atual do API Key,
resolvidos através da cadeia de preço (chain) → guidance → preço base, e correspondem ao
débito real. O preço unitário que o chamador vê varia conforme sua cadeia de preço
(reseller / distributor / empresa / configuração de nível de usuário).
Débito real = uso ÷ quantity × preço unitário × ratio. Para
cobrança de vídeo por segundo: débito real = duration ×
outputPrice × ratio.
Casos extremos e tratamento de erros (um endpoint somente leitura nunca retorna 500 por configuração de preço):
| Cenário | Comportamento |
|---|---|
| Uma faixa falha ao resolver (política de preço nega acesso, configuração ausente) | Pular a faixa, registrar log warn, continuar resolvendo as demais |
| Todas as faixas de um modelo falham ao resolver | Array vazio []; modelo ainda retornado normalmente |
| Modelo sem nenhuma configuração de preço | Array vazio [] |
| Resolução de preço lança exceção não capturada | Capturada no todo, retorna array vazio; endpoint ainda 200 |
Exemplo de resposta (list_models, modelo de texto):
{
"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": "por 1K tokens",
"inputPrice": 0.0025,
"outputPrice": 0.01,
"cachePrice": 0.00125,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Exemplo de resposta (list_image_models, modelo de imagem;
priceTiers mesma estrutura, 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": "por imagem",
"inputPrice": 0,
"outputPrice": 0.04,
"cachePrice": 0,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}
Exemplos
Exemplo 1: uma requisição de chat simples
Pergunte: "Use o ciyuan_market para chamar o claude-sonnet-5 e perguntar o que é o GIL do Python"
A IA chamará chat_completion com:
{
"model": "claude-sonnet-5",
"messages": [{"role": "user", "content": "What is Python's GIL?"}]
}
Exemplo 2: uso de ferramentas via o endpoint Anthropic Messages
Pergunte: "Use o endpoint Messages do ciyuan_market e deixe o modelo decidir se deve verificar o clima"
A IA chamará create_message, passando uma definição de tools e
tool_choice; a resposta incluirá um bloco de conteúdo
tool_use.
Exemplo 3: listar modelos disponíveis
Pergunte: "Liste os modelos na minha conta ciyuan_market"
A IA chamará list_models, retornando IDs, fornecedores, modalidades,
preços e mais para cada modelo disponível.
Exemplo 4: verificar saldo e uso
Pergunte: "Verifique meu uso do ciyuan_market neste mês"
A IA chamará get_balance para o saldo e, em seguida,
list_usage (com start_time delimitado a este mês) para o
detalhamento de uso.
Exemplo 5: gerar uma imagem
Pergunte: "Use o ciyuan_market para gerar uma imagem de uma cidade cyberpunk à noite"
A IA primeiro chamará list_image_models para verificar as especificações,
depois create_image_generation para obter um taskId, e então fará polling
em get_image_generation para obter a URL da imagem.
Exemplo 6: texto para vídeo
Pergunte: "Use o ciyuan_market para gerar um vídeo de 5 segundos de uma nebulosa espacial"
A IA primeiro chamará list_video_models para verificar as especificações,
depois create_video_generation (video_type=1,
duration=5), e após obter um taskId, fará polling em
get_video_generation.
FAQ
A chamada de ferramenta falha com "missing ciyuan_market API Key"
- Você executou
claude mcp addsem--header, ou a chave está errada - Se estiver editando o JSON de configuração diretamente, o nome do campo
headersestá errado (deveria serX-Ciyuanmarket-Api-Key) - Executando localmente sem a variável de ambiente
CIYUAN_MARKET_API_KEYdefinida
A chamada de ferramenta falha com "ciyuan_market returned 401 unauthorized"
A própria chave de API está errada ou expirou — gere uma nova no console do ciyuan_market.
O Claude não está chamando as ferramentas do ciyuan_market — o que fazer?
- Confirme que a conexão mostra ✓ Connected via
claude mcp list - Verifique o status da conexão:
claude mcp get ciyuanmarket - Tente ser explícito: "Use a ferramenta
chat_completiondo ciyuan_market para chamarclaude-sonnet-5…"
A geração de imagem/vídeo fica pendente para sempre
- Faça polling de tarefas de imagem com
get_image_generatione de tarefas de vídeo comget_video_generation— note que o status de uma tarefa de vídeo em execução é "running", não "pending" - A geração leva tempo, geralmente de alguns a dezenas de segundos, mais para vídeo
- Se você passou um
callback_url, a tarefa fará o callback na conclusão — sem necessidade de polling
Erros em list_image_models / list_video_models
Nenhuma das duas ferramentas consome crédito por si só — um erro geralmente indica um
problema de chave ou de rede. Primeiro confirme que list_models funciona
normalmente.
Notas
- Nome do cabeçalho:O MCP passa a chave via
X-Ciyuanmarket-Api-Key. - Consumo de crédito:
chat_completion/create_message/create_response/create_image_generation/create_video_generationconsomem todos crédito da conta — verifiqueget_balanceprimeiro se quiser saber o saldo antecipadamente. - Verifique as especificações antes de gerar:Parâmetros de geração de
imagem/vídeo como model, resolution, ratio, count, duration e video_type devem usar
apenas valores publicados por
list_image_models/list_video_models, caso contrário a chamada resulta em erro. - Sem streaming:Nenhum dos três endpoints de chat suporta streaming — cada um retorna o resultado completo de uma vez.
- Design sem estado:Cada requisição é independente e nenhuma sessão é
armazenada; para conversas de múltiplos turnos, use
previous_response_iddecreate_responseou mantenha o histórico você mesmo emmessages.
Suporte
Obtenha ajuda com o ciyuan_market
Encontre respostas para perguntas comuns sobre API, cobrança, roteamento e integração. Para problemas de produção, envie o ID da solicitação, o rótulo da chave API, o endpoint, o modelo e o carimbo de data/hora para que a equipe possa rastrear a solicitação rapidamente.
FAQ
Clique em uma pergunta para expandir a resposta.
Contato
Escolha a melhor caixa de entrada para a solicitação.
Para incidentes, limites de taxa, questões de cobrança, problemas de roteamento em produção, migração de SDK, compatibilidade de provedor, questões de design de endpoint, planos corporativos, uso comprometido ou requisitos de roteamento de provedor personalizado.












