{"formatVersion":"1","kind":"dock_integration","slug":"openai-api","title":"OpenAI API","summary":"Import a broad Harbor-safe OpenAI action set for models, responses, embeddings, files, images, moderations, batches, uploads, vector stores, fine-tuning, and legacy completions.","description":"A Dock-hosted OpenAI API integration for Harbor. Importing it creates a local http_api port shell plus a broad Harbor-safe OpenAI action set for fixed-route reads, reviewed model execution, reviewed batch and vector-store operations, and fine-tuning lifecycle control. Tokens remain local to Harbor Node.","version":"0.2.0","publisher":{"slug":"openai","name":"OpenAI","websiteUrl":"https://developers.openai.com/"},"category":"AI","tags":["openai","ai","llm","responses","embeddings","vector-stores","fine-tuning","batches"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import. OpenAI actions stay on fixed routes, use typed input.path values where required, and use JSON request bodies for Harbor-safe write flows. Multipart and realtime-only flows are intentionally excluded."},"requiredPlan":"community","portTemplates":[{"kind":"http_api","label":"OpenAI API","description":"OpenAI API connection managed locally through Harbor.","baseUrl":"https://api.openai.com/v1/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bearer"}],"actionTemplates":[{"slug":"list-models","label":"List Models","description":"List the OpenAI models available to the configured API key.","method":"GET","path":"/models","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-model","label":"Get Model","description":"Retrieve a single OpenAI model by model identifier.","method":"GET","path":"/models/{model}","inputs":{"parameters":[{"name":"model","in":"path","schema":{"type":"string"},"description":"OpenAI model identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"delete-fine-tuned-model","label":"Delete Fine-Tuned Model","description":"Delete a fine-tuned OpenAI model by model identifier.","method":"DELETE","path":"/models/{model}","inputs":{"parameters":[{"name":"model","in":"path","schema":{"type":"string"},"description":"Fine-tuned model identifier to delete."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-response","label":"Create Response","description":"Create an OpenAI model response using a bounded JSON request body under input.body.","method":"POST","path":"/responses","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"get-response","label":"Get Response","description":"Retrieve a stored OpenAI response by response identifier.","method":"GET","path":"/responses/{response_id}","inputs":{"parameters":[{"name":"response_id","in":"path","schema":{"type":"string"},"description":"OpenAI response identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"delete-response","label":"Delete Response","description":"Delete a stored OpenAI response by response identifier.","method":"DELETE","path":"/responses/{response_id}","inputs":{"parameters":[{"name":"response_id","in":"path","schema":{"type":"string"},"description":"OpenAI response identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"cancel-response","label":"Cancel Response","description":"Cancel a queued or in-progress OpenAI response.","method":"POST","path":"/responses/{response_id}/cancel","inputs":{"parameters":[{"name":"response_id","in":"path","schema":{"type":"string"},"description":"OpenAI response identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"compact-response","label":"Compact Response","description":"Compact an OpenAI response payload using a bounded JSON request body under input.body.","method":"POST","path":"/responses/compact","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"list-response-input-items","label":"List Response Input Items","description":"List stored input items for a response.","method":"GET","path":"/responses/{response_id}/input_items","inputs":{"parameters":[{"name":"response_id","in":"path","schema":{"type":"string"},"description":"OpenAI response identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"count-response-input-tokens","label":"Count Response Input Tokens","description":"Count tokens for a prospective OpenAI response input using a bounded JSON request body under input.body.","method":"POST","path":"/responses/input_tokens","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-embedding","label":"Create Embedding","description":"Create OpenAI embeddings using a bounded JSON request body under input.body.","method":"POST","path":"/embeddings","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-image","label":"Create Image","description":"Generate images with OpenAI using a bounded JSON request body under input.body.","method":"POST","path":"/images/generations","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-speech","label":"Create Speech","description":"Generate text-to-speech audio with OpenAI using a bounded JSON request body under input.body.","method":"POST","path":"/audio/speech","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-moderation","label":"Create Moderation","description":"Run OpenAI moderation on text or image inputs using a bounded JSON request body under input.body.","method":"POST","path":"/moderations","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-completion","label":"Create Completion","description":"Create a legacy OpenAI completion using a bounded JSON request body under input.body.","method":"POST","path":"/completions","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"list-files","label":"List Files","description":"List files available to the configured OpenAI account.","method":"GET","path":"/files","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-file","label":"Get File","description":"Retrieve OpenAI file metadata by file identifier.","method":"GET","path":"/files/{file_id}","inputs":{"parameters":[{"name":"file_id","in":"path","schema":{"type":"string"},"description":"OpenAI file identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-file-content","label":"Get File Content","description":"Retrieve file content for an OpenAI file identifier.","method":"GET","path":"/files/{file_id}/content","inputs":{"parameters":[{"name":"file_id","in":"path","schema":{"type":"string"},"description":"OpenAI file identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"delete-file","label":"Delete File","description":"Delete an OpenAI file by file identifier.","method":"DELETE","path":"/files/{file_id}","inputs":{"parameters":[{"name":"file_id","in":"path","schema":{"type":"string"},"description":"OpenAI file identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-batch","label":"Create Batch","description":"Create an asynchronous OpenAI batch job using a bounded JSON request body under input.body.","method":"POST","path":"/batches","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"list-batches","label":"List Batches","description":"List OpenAI batch jobs with optional pagination filters.","method":"GET","path":"/batches","inputs":{"parameters":[{"name":"after","in":"query","schema":{"type":"string"},"description":"Cursor for the next page of batch results."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Maximum number of batches to return."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-batch","label":"Get Batch","description":"Retrieve an OpenAI batch job by batch identifier.","method":"GET","path":"/batches/{batch_id}","inputs":{"parameters":[{"name":"batch_id","in":"path","schema":{"type":"string"},"description":"OpenAI batch identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"cancel-batch","label":"Cancel Batch","description":"Cancel an OpenAI batch job by batch identifier.","method":"POST","path":"/batches/{batch_id}/cancel","inputs":{"parameters":[{"name":"batch_id","in":"path","schema":{"type":"string"},"description":"OpenAI batch identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-upload","label":"Create Upload","description":"Create an OpenAI upload container using a bounded JSON request body under input.body.","method":"POST","path":"/uploads","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"complete-upload","label":"Complete Upload","description":"Complete an OpenAI upload after all upload parts are present.","method":"POST","path":"/uploads/{upload_id}/complete","inputs":{"parameters":[{"name":"upload_id","in":"path","schema":{"type":"string"},"description":"OpenAI upload identifier."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"cancel-upload","label":"Cancel Upload","description":"Cancel an OpenAI upload before completion.","method":"POST","path":"/uploads/{upload_id}/cancel","inputs":{"parameters":[{"name":"upload_id","in":"path","schema":{"type":"string"},"description":"OpenAI upload identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-vector-stores","label":"List Vector Stores","description":"List OpenAI vector stores.","method":"GET","path":"/vector_stores","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-vector-store","label":"Create Vector Store","description":"Create an OpenAI vector store using a bounded JSON request body under input.body.","method":"POST","path":"/vector_stores","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"get-vector-store","label":"Get Vector Store","description":"Retrieve an OpenAI vector store by vector store identifier.","method":"GET","path":"/vector_stores/{vector_store_id}","inputs":{"parameters":[{"name":"vector_store_id","in":"path","schema":{"type":"string"},"description":"OpenAI vector store identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"update-vector-store","label":"Update Vector Store","description":"Modify an OpenAI vector store using a bounded JSON request body under input.body.","method":"POST","path":"/vector_stores/{vector_store_id}","inputs":{"parameters":[{"name":"vector_store_id","in":"path","schema":{"type":"string"},"description":"OpenAI vector store identifier."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-vector-store","label":"Delete Vector Store","description":"Delete an OpenAI vector store by vector store identifier.","method":"DELETE","path":"/vector_stores/{vector_store_id}","inputs":{"parameters":[{"name":"vector_store_id","in":"path","schema":{"type":"string"},"description":"OpenAI vector store identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"search-vector-store","label":"Search Vector Store","description":"Search an OpenAI vector store using a bounded JSON request body under input.body.","method":"POST","path":"/vector_stores/{vector_store_id}/search","inputs":{"parameters":[{"name":"vector_store_id","in":"path","schema":{"type":"string"},"description":"OpenAI vector store identifier."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-fine-tuning-job","label":"Create Fine-Tuning Job","description":"Create an OpenAI fine-tuning job using a bounded JSON request body under input.body.","method":"POST","path":"/fine_tuning/jobs","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"list-fine-tuning-jobs","label":"List Fine-Tuning Jobs","description":"List OpenAI fine-tuning jobs.","method":"GET","path":"/fine_tuning/jobs","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-fine-tuning-job","label":"Get Fine-Tuning Job","description":"Retrieve an OpenAI fine-tuning job by job identifier.","method":"GET","path":"/fine_tuning/jobs/{fine_tuning_job_id}","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-fine-tuning-events","label":"List Fine-Tuning Events","description":"List events for an OpenAI fine-tuning job.","method":"GET","path":"/fine_tuning/jobs/{fine_tuning_job_id}/events","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"cancel-fine-tuning-job","label":"Cancel Fine-Tuning Job","description":"Cancel an OpenAI fine-tuning job.","method":"POST","path":"/fine_tuning/jobs/{fine_tuning_job_id}/cancel","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"pause-fine-tuning-job","label":"Pause Fine-Tuning Job","description":"Pause an OpenAI fine-tuning job.","method":"POST","path":"/fine_tuning/jobs/{fine_tuning_job_id}/pause","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"resume-fine-tuning-job","label":"Resume Fine-Tuning Job","description":"Resume an OpenAI fine-tuning job.","method":"POST","path":"/fine_tuning/jobs/{fine_tuning_job_id}/resume","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-fine-tuning-checkpoints","label":"List Fine-Tuning Checkpoints","description":"List checkpoints for an OpenAI fine-tuning job.","method":"GET","path":"/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints","inputs":{"parameters":[{"name":"fine_tuning_job_id","in":"path","schema":{"type":"string"},"description":"OpenAI fine-tuning job identifier."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"}],"helpText":"Import to Harbor, configure local auth, then validate read actions first before enabling prompt-bearing, batch, vector-store, upload, or fine-tuning actions. Keep OpenAI write actions on approval unless your local policy explicitly allows specific flows.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. OpenAI actions use Authorization: Bearer, typed input.path values where required, and bounded JSON bodies for Harbor-safe write flows. Multipart upload parts, realtime sockets, and other non-http_api-friendly surfaces are intentionally excluded."}